Kap 08 K 1 K Definisjon En k

  • Slides: 17
Download presentation
Kap 08 Kø 1

Kap 08 Kø 1

Kø - Definisjon En kø (eng queue) er en lineær struktur hvor elementer kan

Kø - Definisjon En kø (eng queue) er en lineær struktur hvor elementer kan innsetttes kun i den ene enden av listen, kalt bak, og fjernes kun i den andre enden av listen, kalt foran. Kø: FIFO (First In First Out). To basis-operasjoner knyttet til kø: q. Add Innsetting av element i en kø q. Remove Fjerning av element fra en kø 2

Ikke-sirkulær kø - Eks Legg merke til at vi initielt har satt Foran =

Ikke-sirkulær kø - Eks Legg merke til at vi initielt har satt Foran = 1, til tross for at vi ikke har noen elementer 3 i køen. Dette vil forenkle algoritmene noe.

Sirkulær kø - Eks g h Legg merke til den noe merkelige avslutningen med

Sirkulær kø - Eks g h Legg merke til den noe merkelige avslutningen med Foran = 5 og Bak = 4 til tross for at vi ikke har noen elementer i køen. 4

q. Add - Array-implementering Ikke-sirkulær kø x x x foran bak q. Add (queue,

q. Add - Array-implementering Ikke-sirkulær kø x x x foran bak q. Add (queue, post, bak, max, full) /* /* Rutinen plasserer en post (et element) i en kø queue : Køen som posten skal plasseres i post : Posten som skal plasseres i køen bak : Enden av køen max : Maksimalt antall elementer i køen full : Returnerer med vedien true hvis køen er full slik at post ikke kan plasseres IF bak = max THEN full : = true ELSE full : = false bak : = bak + 1 queue[bak] : = post ENDIF */ */ 5

x x x q. Remove - Array-implementering Ikke-sirkulær kø q. Remove /* /* foran

x x x q. Remove - Array-implementering Ikke-sirkulær kø q. Remove /* /* foran bak (queue, post, foran, bak, tom) Rutinen plasserer en post (et element) i en kø queue : Køen som posten skal hentes/slettes fra post : Posten som skal hentes/slettes i køen foran : Fronten av køen bak : Enden av køen tom : Returnerer med vedien true hvis køen er tom slik at post ikke kan hentes/slettes IF bak < foran THEN tom : = true ELSE tom : = false post : = queue[foran] foran : = foran + 1 ENDIF */ */ 6

Sirkulær kø - Modulus-funksjonen mod(a, b) = rest ved divisjon av heltall a med

Sirkulær kø - Modulus-funksjonen mod(a, b) = rest ved divisjon av heltall a med heltall b mod(5, 2) = 1 mod(3, 5) = 3 mod(a, b) skrives i Java og C++ som : a%b 7

Sirkulær kø - Test på tom kø Tom kø: mod(bak, max) + 1 =

Sirkulær kø - Test på tom kø Tom kø: mod(bak, max) + 1 = foran x Dessverre viser det seg at den samme relasjonen også gjelder når køen er full. x 8

Sirkulær kø - Tom kø / Full kø Foregående problem kan løses ved alltid

Sirkulær kø - Tom kø / Full kø Foregående problem kan løses ved alltid å la minst en plass være ledig. Ett element i køen Tom kø Full kø : : : foran = bak mod(bak, max) + 1 = foran 9

q. Add - Array-implementering Sirkulær kø x x x foran bak q. Add (queue,

q. Add - Array-implementering Sirkulær kø x x x foran bak q. Add (queue, post, foran, bak, max, full) /* /* /* Rutinen plasserer en post (et element) i en sirkulær kø */ queue : Køen som posten skal plasseres i */ post : Posten som skal plasseres i køen */ foran : Fronten av køen */ bak : Enden av køen */ max : Maksimalt antall elementer i køen */ full : Returnerer med vedien true */ hvis køen er full */ slik at post ikke kan plasseres */ IF mod(bak, max)+1 = foran THEN full : = true ELSE full : = false bak : = mod(bak, max) + 1 queue[bak] : = post ENDIF 10

x x x q. Remove - q. Remove /* /* Array-implementering Sirkulær kø foran

x x x q. Remove - q. Remove /* /* Array-implementering Sirkulær kø foran bak (queue, post, foran, bak, tom) Rutinen plasserer en post (et element) i en sirkulær kø */ queue : Køen som posten skal hentes/slettes fra */ post : Posten som skal hentes/slettes i køen */ foran : Fronten av køen */ bak : Enden av køen */ tom : Returnerer med vedien true */ hvis køen er tom */ slik at post ikke kan hentes/slettes */ IF mod(bak, max)+1 = foran THEN tom : = true ELSE tom : = false post : = queue[foran] foran : = mod(foran, max) + 1 ENDIF 11

q. Add - Lenket liste implementering foran bak Data x Lenke q. Add (post,

q. Add - Lenket liste implementering foran bak Data x Lenke q. Add (post, bak) /* /* /* Rutinen plasserer en post (et element) i en kø post : Posten som skal plasseres i køen bak : Peker til enden av køen p p. data p. lenke bak : = : = : = */ */ */ new q. Node post null p p 12

q. Remove - foran Lenket liste implementering bak x Data Lenke q. Remove (post,

q. Remove - foran Lenket liste implementering bak x Data Lenke q. Remove (post, foran, bak, tom) /*Rutinen plasserer en post (et element) i en kø impl som lenket liste */ IF foran = bak THEN tom : = true ELSE tom : = false p : = foran. lenke post : = p. data foran. lenke : = p. lenke IF bak = p THEN bak : = foran ENDIF delete(p) ENDIF 13

Anvendelser - Tidsdelingsssytem med bruk av felles ressurser. ready. Queue A B blocked. Queue

Anvendelser - Tidsdelingsssytem med bruk av felles ressurser. ready. Queue A B blocked. Queue Prosess A er i øyeblikket under kjøring. A gjør forespørsel om bruk av printer. Tidsperiode for A løper ut under printing. A plasseres i en ready-queue (alle kjøreressurser er tilgjengelige for A) B overtar kjøringen. B gjør forespørsel om bruk av printer. B går inn i en blocked-queue inntil A er printet ferdig. 14

Anvendelser - Prioritetskø Hensiktsmessig med lenket liste implementering siden innsetting i en slik prioritetskø

Anvendelser - Prioritetskø Hensiktsmessig med lenket liste implementering siden innsetting i en slik prioritetskø ikke nødvendigvis kan gjøres i enden av listen. 15

Klassehierarki - Kø I_Comparable I_Container I_Queue A_Object A_Container Queue. As. Array Test Queue. As.

Klassehierarki - Kø I_Comparable I_Container I_Queue A_Object A_Container Queue. As. Array Test Queue. As. Linked. List Test 16

END 17

END 17