PrioritetsKøer I. ADGANG TIL ELEMENTER I EN SAMLING gjeom Positio gjeom økkel II. TOTALE ORDNINGER OG NØKLER III.PRIORITETSKØ ADT PrioritetsKø-Sorterig IV. IMPLEMENTASJON MED SEQUENCE ADT V. IMPLEMENTASJON MED HEAP DS implmetasjo av Heap operasjoer BiaryTree / Array VI. LOCATOR DESIGNMØNSTER (6.) Kap. 6 (kursorisk: 6..) i-0 : H- 7. PrioritetsKøer: adgag til elemetee ku v.hj.a. plasserig (Positio) første/siste LiFi Cotaier -te/vilkårlig PositioalCotaier KeyBasedCotaier med økkel==k Queue Stack PositioalSequece Tree miste/største Dictioary Deque Sequece BiaryTree PriorityQueue struktur er uavhegig av (abstrakte) objekters itere struktur og egeskaper... me f.eks. Sorterig er e operasjo på strukturer med rekkefølge på Posisjoer, og hvor alle elemetee ka sammeliges (mht. e økkel-verdi) adgag til elemetee v.hj.a. økkel plasserig i e samlig avheger av elemetets verdi (økkel) sorter i-0 : H- 7. PrioritetsKøer:
II. Nøkler og Ordiger Gitt e (vilkårlig) megde S :. e biær relasjo R på S, er e megde av par (s,p) der s og p ε S (ma skriver ofte (s,p) ε R som R(s,p), evt. s p). e relasjo R er e total ordig (TO) på S hviss de er: refleksiv : R(s,s) for alle s ε S trasitiv : for alle s,p,q ε S hvis R(s,p) & R(p,q) så R(s,q) atisymmetrisk : for alle s,p ε S hvis R(s,p) & R(p,q) så s = p (for to vilkårlige s p ε S vil ete R(p,s) eller R(s,p) ) Nøkkel (for e megde E) er e fuksjo key : E S, der I. S er e (vilkårlig!) totalt ordet megde II. key er ijektiv, dvs. slik at : hvis e f så key(e) key(f) (forskjellige elemeter har forskjellige økkel-verdier) tek på key(e) som e egeskap/et attributt til e S : R(x,y) heltallee x y et alfabet x kommer-ikke-etter y alle streger (ord) leksiskografisk ordig over et gitt alfabet Samme megde ka TOs på forskjellige måter heltallee xy, ( x y el. x = y og x<0) heltallee x < y pers. i 6-te rad x sitter-til-vestre-for y * x sitter-til-vestre-for -eller-der-hvor y meesker x ygre-e y * x ikke-ygre-e y E S : key(e) persoer persoumre : e s persr (heltall, ) *persoer plasser, : e s sitteplass i 6-te rad til-vestre-eller-likt meesker heltall, : e s alder? Ofte, oppfyller ikke økler II: flere elemeter fra E ka ha samme økkel-verdi. i-0 : H- 7. PrioritetsKøer: Objekter med økler class Pers { e= ew E(,, Oslo ) it alder; key: E heltall, e.alder; (ikke etydig) it pr; key: E heltall, e.pr; (etydig) Strig adr; key: E Strig, compareto e.adr; (ikke etydig)... } Nøkkel for et Objekt e ka være et vilkårlig Objekt k : Item(k,e) e KeyBasedCotaier vil samle Item s abstrakt TO uttrykkes ved iterface Comparator som vil parametrisere ehver implemetasjo av KeyBasedCotaier spesifikk TO er e class X implemets Comparator class itkeycomp implemets Comparator { // atar Item ( key:iteger,?) boolea islesstha(object a, Object b) { Item aa = (Item)a; Item bb= (Item)b; retur (( (Iteger) aa.key() ). itvalue() < ( (Iteger) bb.key() ). itvalue(); }... } class strigkeycomp implemets Comparator { // atar Item ( key:strig,?) boolea islesstha(object a, Object b) { Item aa = (Item)a; Item bb= (Item)b; retur ( (Strig) aa.key() ). compareto ( (Strig) bb.key() ) < 0 ; }... } public class Item { // et par Objekt-økkel private Object el, key; public Item(Object k, Object e) { setelem(e); setkey(k); } public Object key() { retur key;} public Object elemet() { retur el;} public void setkey(object k) {key=k;} public void setelemet(object e) {el=e;} } i-0 : H- 7. PrioritetsKøer:
PriorityQueue ADT /** adgag gjeom miste økkel i e aktuell ordig bestemt av implemetasjo */ public iterface PriorityQueue exteds KeyBasedCotaier { /** sett i et ytt elemet med agitt økkel * @param k økkel til det ye elemetet * @param e elemetet som skal settes i */ void isertitem(object k, Object e); /** returer Objektet med miste økkel * @retur Objektet med miste økkel * @exceptio EmptyCotaierExceptio hvis isempty() */ Object mielemet(); /** returer miste økkel i køe * @retur miste økkel * @exceptio EmptyCotaierExceptio hvis isempty() */ Object mikey(); /** fjer og returerer elemetet med miste økkel * @retur elemetet med miste økkel * @exceptio EmptyCotaierExceptio hvis isempty() */ Object removemielemet(); /** returer lokator til miste elemetet */ Locator mi(); } år e har et Object-atributt som økkel : PQ. isertitem( e.key(), e ) me økkel ka bestemmes ved isettig : PQ. isertitem( ewkey(e), e ) i-0 : H- 7. PrioritetsKøer: PrioritetsKø-Sorterig void pqsort(sequece S, PriorityQueue PQ) // atar at PQ bruker Objektee som økler a) while (! S.isEmpty()) // fjer ett og ett elemet fra S = O() e = S.removeFirst() // og sett dem i i PQ PQ.isertItem(e,e) b) while (! PQ.isEmpty()) // fjer ett og ett elemet fra PQ e = PQ.removeMiElemet() // og sett dem i på slutte av S = O() S.isertLast(e) trykkfeil i boke s.07 + P k.isert e + P k.remmi( ) + k = k = i-0 : H- 7. PrioritetsKøer: 6
IV. Implemetasjo av PriorityQueue med Sequece I DATA REPRESENTASJON Sequece, der hver Positio II DATA STRUKTUR lagrer e Item public class Item { public Object elemet() {...} public Object key() {...}... } class PQSequece implemets PriorityQueue { private Sequece S; private Comparator cp; /** @param sq bør være tom sekves @param c Comparator for sammelikig av Item med passede key-objekter */ public PQSeq(Sequece sq, Comparator c) { S = sq; cp = c; } III DATA INVARIANT Item i S ka sammeliges med cp S er usortert S er sortert i-0 : H- 7. PrioritetsKøer: 7 PriorityQueue med Sequece DATA INVARIANT: INGEN USORTERT A D Z... B DATA INVARIANT: SORTERT STIGENDE A B D... Z void isertitem(o,k) sq.isertlast(ew Item(k,o)) Object mikey(): fi miste... Positio p = sq.first(); Object o = p.elemet(); while ( p!= sq.last() ) { p = sq.after(p); if (cp.lt(p.elemet(), o) o = p.elemet(); } retur ((Item)o).key(); Object mielemet() : fi... Object removemi() : fi og fjer... C O() Θ() Θ() Θ() Ivariate skal velges avhegig av forveted hyppighet av operasjoer Kompleksitet er relativ til implemetasjo av Sequece (LL/DL/Array) C void isertitem(o,k) O() Item y= ew Item(k,o); if ( sq.isempty() ) sq.isertfirst(y) else if ( cp.islessthaorequal(y, sq.first().elemet()) ) sq.isertfirst(y) else if ( cp.isgreaterthaorequal(y, sq.last().elemet()) ) sq.isertlast(y) else Positio c = sq.first() while (cp.isgreatertha(y, c.elemet() ) c= sq.after(c) sq.isertbefore(c,y) Object mikey() O() retur ((Item) sq.first().elemet()). key() Object mielemet() O() retur ((Item) sq.first().elemet()). elemet() Object removemi() O() retur ( (Item)sq.remove(sq.first()) ). elemet() i-0 : H- 7. PrioritetsKøer:
Isertio / Selectio Sort u: s: u: s: u: s: u: s: u: s: u: s: u: s: u: s: u: u: s: s: P k.isert e P k.remmi( ) k = k = O( ) + O( ) u: + -------------- + -------------- s: :O( ) / Ω( ) :O( ) / Ω() i-0 : H- 7. PrioritetsKøer: er et Biært Tre T (for lagrig av objekter med økler) som tilfredstiller DATA INVARIANT: V. Heap DataStruktur. Heap-Orderig ( relasjoell ) for ehver ode v (utatt rote): key(v) key(paret(v)). Komplett Biært Tre ( strukturell ) T med høyde h:.a) alle ivåee i=0,,...,h- har maks. o. oder = i.b) på ivå h- alle itere oder er til vestre for alle ekstere Heap med (itere) oder har høyde: h = log(+) + +...+ h- + = h- + +...+ h- + h- = h h log() + & log(+) h 0 6 6 6 7 7 7 h= sist i-0 : H- 7. PrioritetsKøer: 0
Implemetasjo av PriorityQueue med Heap DATASTRUKTUR private BiaryTree heap private Positio sist 6 private Comparator cp <, >, DATAINVARIANT =, heap oppfyller Heap-Ivariat med hesy til cp-sammelikig og sist er siste posisjo i heap: ==ull hviss heap.isempty() 7 public PQhp(Comparator c) { cp = c ; heap = ew BiaryTreeIMP(); } // sist==ull hviss heap.isempty() private boolea DI() { traverser Heap og sjekk at ehver ode v har key(v) key(paret(v)) : cp. isgreaterthaorequalto ( (Item)v.elemet(), (Item) heap.paret(v).elemet() ) Komplett BiTree er vaskeligere } public Object mielemet() throws EmptyCotaierExceptio { if (heap.isempty()) throw ew EmptyCotaierExceptio( ); retur ((Item) Heap.root().elemet()). elemet() ; } public Object mikey() throws EmptyCotaierExceptio { if (heap.isempty()) throw ew EmptyCotaierExceptio( ); retur ((Item) Heap.root().elemet()). key() ; } i-0 : H- 7. PrioritetsKøer: A. isertitem(o,k) i Heap sist 0 7 7. Bevar KOMPLETT BINÆRT TRE INVARIANT: Fi isettigsode til høyre for siste utvid bladet til e iter ode og sett i det ye elemetet gitt sist:o() el. O(log ). Gjeopprett HEAP-ORDERING INVARIANT : Flytt det ye elemetet opp itil dets forelder har midre økkel h= log(+) = O(log ) sist 0 7 0 7 7 7 i-0 : H- 7. PrioritetsKøer:
A.. Fi isettigsode. Gitt sist, fi isettigsode u avhegig av implemetasjo av BiaryTree Sequece (array): sist = ; u = sist + O() BiaryTree iterface (vilkårlig implemetasjo) Avhegig av hvem sist er har vi tre tilfeller: a) T.isEmpty() : u = T.root() b) ytterste ode på ivå h- u = sist while ( u!= root() && u!= leftchild(paret(u)) ) u = paret(u) if ( u!= root) u = rightchild(paret(u)) while (! isexteral(u) ) u = leftchild(u) retur u O(log ) u c) e mellomode på ivå h- 0 7 0 7 7 u i-0 : H- 7. PrioritetsKøer: A.. Oppover boblig u = siste A. while ( u!= root() && u!= leftchild(paret(u)) ) u = paret(u) if ( u!= root) u = rightchild(paret(u)) while (! isexteral(u) ) u = leftchild(u) retur u O(log ) expadexteral(u) ; u.setelemet(y) ; 0 7 7 while ( u!= root() && A. cp.islesstha( u.elemet(), paret(u).elemet() ) ) swap(u, paret(u)) u = paret(u); O(log ) i-0 : H- 7. PrioritetsKøer:
B. removemielemet() fra Heap. hold root-objektet (til retur) ((Item)root().elemet()).elemet(). Bevar KOMPLETT BINARYTREE INVARIANT : plasser sist.elemet() i rot-posisjo og fjer sist-posisjo = sett i et ytt blad (BiTree: removeaboveexteral(leftchild(sist)) ) oppdater sist O( + log ) 7 7 0. Gjeopprett HEAP-ORDERING INVARIANT: flytt det ye rot-elemetet ed til passede posisjo ( edover boblig ) u = root(); doe = false; while (! doe ) { if ( isexteral(leftchild(u)) && isexteral(rightchild(u)) ) doe = true else { if ( isexteral(rightchild(u)) ) este = leftchild(u) else if (cp.islesstha( leftchild(u).elemet(), rightchild(u).elemet() )) este = leftchild(u) else este = rightchild(u); 7 0 if ( cp.isgreatertha( u.elemet(), este.elemet() )) swap(u,este); u = este; else doe= true }} O(log ) 7 i-0 : H- 7. PrioritetsKøer: PrioritetsKø Sorterig P k.isert ( e ) P k.remmi( ) k = k = O( ) + O( ) Selectio Sort u: -------------- + :O( ) Isertio Sort + -------------- s: :O( ) Heap Sort log() h:... log() :O( log()) i-0 : H- 7. PrioritetsKøer: 6
Oppdater aldri objekter i e Samlig! fordi økkel-verdi avheger, typisk, av Objektets attributter class El { private it alder; private it pr; public Object key() { retur ew Iteger(alder); } public void setalder(it a) { alder=a; }... } PriorityQueue pq = ew PQSeq(ew itcomp()); El e= ew El(); El e= ew El(); e pq.isertitem(e, e.key()); pq.isertitem(e, e.key()); e pq isertitem(o,k) remmielemet() mielemet() mikey()...... El o = (El) pq.mielemet(); o o. setalder(6); 6 e. setalder(0); 6 0 i-0 : H- 7. PrioritetsKøer: 7 Et godt - metodologisk - råd!!!. IMPLEMENETER DATA INVARIANT I eksemplet over: for hver Item i har vi at: i.elemet().key() == i.key() sekves er sortert. UNNGÅ OPPDATERING AV OBJEKTER I NØKKEL-BASERTE-SAMLINGER MÅ DU OPPDATERE SLIKE OBJEKTER:. FJERN FØR OPPDATERING: El o = (El) pq.removemielemet(); o.setalder(6); pq.isertitem(o, o.key());. fjer fra Samlige. oppdater. sett i i Samlige Dette ka virke oe kostbart (spesielt år vi oppdaterer attributter som ikke påvirker økkel-verdier) me :. Hvilke attributter påvirker økkel ka variere og være uklart. Kostade øker valigvis ikke algoritmers kompleksistet. Resulterede kode er betydelig sikrere. BRUK MER SOFISTIKERT GRENSESNITT... i-0 : H- 7. PrioritetsKøer:
Locator desigmøster tilsvarer Positio for samliger der Objekter lokaliseres v.hj.a. økkel (KeyBasedCotaier) public iterface KeyBasedCotaier exteds Cotaier { /** Iserts a Locator ito this Cotaier. */ void isert(locator) /** Iserts a <key, elemet> pair ito this Cotaier. */ Locator isert(object k, Object o) /** Eumeratio of all the Locators withi this Cotaier. */ Eumeratio locators() /** Eumeratio of all of the keys of all the locators i the Cotaier. */ Eumeratio keys() /** Whe you eed a locator that ca be iserted ito this KeyBasedCotaier but do't wat to isert it quite yet. */ Locator makelocator(object k, Object o) /** Removes a elemet from this Cotaier. */ void remove(locator) Object replaceelemet(locator l, Object o) /** Chages the mappig of a Locator's elemet to a ew key. @retur the old key to which the Locator s elemet was mapped */ Object replacekey(locator, Object) } public iterface Locator { Object elemet() Object key() Cotaier cotaier() boolea iscotaied() } implemetasjo vil kreve e god del maipulerig med datastrukture i-0 : H- 7. PrioritetsKøer: Oppsummerig Typer av Samlig LiFi (Stack, Queue) PositioalCotaier KeyBasedCotaier Nøkkel: Totale Ordiger objekter med økler (Item) Prioritetskø ADT : implemetasjo og sorterigsmøster usortert sekves seleksjosort sortert sekves istikksort heap heapsort Heap datastruktur: Biært tre + dataivariat isettig / fjerig! opprettholdelse av dataivariate Locator desigmøster: overtar rolle av Positio for KeyBasedCotaier yttig år objekter/økler må oppdateres mes de er i e samlig i-0 : H- 7. PrioritetsKøer: 0