6. Elsőbbségi (prioritásos) sor Közapi fogalma, megjeleése: pl. sürgősségi osztályo a páciesek em a beérkezési időek megfelelőe, haem a sürgősség mértéke szerit kerülek ellátásra. Az operációs redszerekbe a prioritásos jobok feldolgozása is hasoló elv alapjá törtéik. Keressük azt az adatszerkezetet, amelybe az elsőbbségi sor típus tárolása hatékoy módo lehetséges. Ez azt jeleti, hogy szereték, ha az elsőbbségi sor műveleteit a lehető leggyorsabba tudák végrehajtai. Jó lee olya struktúrát találi, amelybe a beérkező beteg elhelyezése, illetve az ellátásra következő pácies kiválasztása (együttese miél rövidebb időt vee igéybe. (Milye elredezésbe ültessük le őket a váróterembe? A válasz em triviális, általába egy kezdő em is ismeri, oha a veremről, sorról már tudja, hogy hogya ézek ki.) 6.. ADT Az egyszerűség kedvéért a P prioritásos sor típusba csak az egyes elemek prioritását tesszük be, az elemet magát em. Így a sorba csak N-beli elemek vaak.. Műveletek Eze műveletek elevezése más köyvekből Empty: P Üres Create IsEmpty: P L Üres? Empty? Isert: P N P Sorba Equeue Max: P N Első Prior / Első Elem MaxPrior DelMax: P P N Sorból Serve / Dequeue. Megszorítások: D Max = D DelMax = P \ {Empty} 3. Axiómák: p P-re, N. IsEmpty(Empty) vagy p = Empty IsEmpty(p). IsEmpty(p) p = Empty 3. IsEmpty(Isert(p,) 4. Max(p) = DelMax(p), ahol a -es idex a pár második kompoesét jelzi. 5. Isert(DelMax(p)) = p 6. IsEmpty(DelMax(p) ) Max(p) Max(DelMax(p) ) 7. Max(p) DelMax(Isert(p,) = p Max(Isert(p,) = 8. < Max(p) Max(Isert(p,) = Max(p) 9. DelMax(Isert(Empty,) = (Empty, 0. Max(Isert(Empty,) = Megjegyzés: A 4.-8. axiómákál feltettük, hogy IsEmpty(p).
6.. ADS és reprezetációs szit A két potot együtt tárgyaljuk, ugyais meg kell vizsgáli, hogy milye reprezetációval tudjuk leghatékoyabbá tei a típus műveleteit. A külöböző megvalósítási módok pedig külöböző szerkezeti tulajdoságokat eredméyezek, melyekkel az ADS-szit foglalkozik. A következőkbe láti fogjuk, hogy bármely megvalósítást is választjuk, az Empty és IsEmpty műveletek Θ() hatékoyságúak, ezért midig csak a többi művelet hatékoyságát vizsgáljuk.. Megvalósítás: Redezetle tömbbe kerülek az elemek, pl. a beírás sorredjébe. ) ) k max = k jelzi a midekori elemszámot. Az egyes típusműveletek hatékoysága (T( az összehasolítások számát jelöli): Isert (A[..],t): Ha a tömb ics tele, akkor k értékét öveljük -el, A[k] értékét t-re állítjuk. T( = Θ(). Max (A[..]): Ha a sor em üres, akkor egy MaxKer-rel megoldható a feladat. T( = = Θ(. DelMax (A[..]): A maximális és egybe törledő elem megkeresése az előzőek alapjá törtéik. Ha i a legagyobb elem idexe, akkor a törléshez A[i] megkapja A[k] értékét, k értéke pedig -el csökke. T( = Θ(. Isert (A[..],t) Max (A[..]) DelMax (A[..]) k = k := k + A[k] := t MaxKer (A[..k],i) Retur(A[i]) MaxKer (A[..k],i) t := A[i] A[i] := A[k] k := k Retur(t) Megjegyzés: Ha T( em korlátozódik az összehasolítások számára, haem általába végrehajtási időt jelöl, a feti agyságredek akkor is jók. Javítás: Nem evezhetjük új megvalósítási módak az alábbiakat, az előzőhez képest csak új változót vezetük be: maxh maxh midig a maximális elem idexe (helye)
Az így módosított stuktogramok: Isert (A[..],t) Max (A[..]) DelMax (A[..]) H I B A k = k := k + A[k] := t t > A[maxh] maxh := k SKIP Retur(A[maxh]) H I B A t := A[maxh] A[maxh] := A[k] k := k MaxKer (A[..k],maxh) Retur(t) A műveletigéyek: Isert: változatlaul T( = Θ(), mivel maxh karbatartása itt egyetle (feltételes) értékadással megoldható. Max: T( = Θ(), itt tehát javítottuk! DelMax: T( = Θ(, mert a (eleve megjelölt) maximum törlése utá a maxh karbatartásához újra végre kell hajtai egy MaxKer-t.. Megvalósítás: Redezett tömbbe helyezzük el az elemeket. A maximális elem midig az utolsó. Haszáljuk ki azt, hogy egy redezett tömbbe egy elemet logaritmikus (=biáris) kereséssel lehet megtaláli. Ha a keresett elem ics a tömbbe, akkor a logaritmikus keresés jelzi ezt és ebbe az esetbe a keresés idexeiek végső helyzete alapjá meg lehet modai, hogy hol lee a keresett elem helye (HF!). Oda be is szúrhatjuk az elemet, ha a tőle jobbra lévőket eggyel jobbra léptetjük. Az alábbi LogKer (A[..k],t,i) tehát úgy működik, hogy ha a t elem ics A[..k]-ba, akkor az i idex értéke jelzi, hogy hol lee a helye, azaz hová kell beszúri. Isert (A[..],t) Max (A[..]) DelMax (A[..]) k = LogKer (A[..k],t,i) j := k j i A[j+] := A[j] Retur(A[k]) t := A[k] k := k Retur(t) j := j A[i] := t k := k +
Megjegyzés: Ez a speciális Isert már egy javítási kísérlet eredméye ahhoz a változathoz képest, amely lieárisa keresi meg a beszúrás helyét. A műveletigéyekre térve, itt az Isert miatt MT(-et, vagy AT(-et kell számoluk. A logaritmikus keresés átlagos összehasolítás száma kb. log, tehát agyságredbe log, a léptetés pedig átlagosa k/ elemre voatkozik, ahol k a tömb aktuális elemszáma, ami pedig átlagos esetbe /-ek vehető. A léptetések várható száma így kb. /4, ami agyságredbe lieáris. Isert: Max: AT( = Θ(log + Θ( = Θ(. MT( = Θ( (yilvávalóa T( = Θ(). DelMax: T( = Θ(). Az Isert és a DelMax műveletek hatékoyságára pot fordított eredméyt kaptuk, mit az előző reprezetációba. Ez a második ábrázolás érezhetőe kevesebbet dolgozik, de agyságredbe ics köztük külöbség. 3. Megvalósítás: Egy kupac tulajdoságú fát töltük fel az elemekkel. A kupac (heap) egy olya majdem teljes, balra tömörített biáris fa (tehát az utolsó szit jobb oldaláról esetleg hiáyozhatak elemek), amelybe mide belső elem agyobb, vagy egyelő, mit a gyermekei. De a számítástechikai megvalósítás ebbe az esetbe sem lesz poiteres, ajálott a fát szitfolytoosa egy tömbbe raki. (Jegyezzük meg: a heap-et midig tömbbe ábrázoljuk, em pedig poiterese!) Ha az eredetileg meglévő kapcsolatokat lácokét behúzzuk a vektor egyes elemei között, akkor láthatjuk, hogy a tömb sem em redezetle, sem em teljese redezett, haem egy bizoyos kompromisszumos részbe redezettség áll fe: az elemek az egyes lácok meté redezettek, mivel csökkeő sorozatokat alkotak. max Az egyes típusműveleteket itt csak ituitív szite adjuk meg, potos megírásukra később kerül sor (lásd: kupacredezés / heap sort). Isert: Az új csúcs beszúrásával meg kell tartauk a kupac tulajdoságot, ezért az új csúcs az utolsó sorba, balról az első üres helyre, vagy ha az utolsó sor teljes, akkor egy új sor bal szélére kerül. De még redbe kell hozi a csúcsok értékeiek viszoyát, tehát elemcseréket végzük alulról a gyökér felé haladva a megfelelő élsorozato (tömbél a megfelelő láco, ameddig szükséges. Nézzük eek működését az alábbi kupaco, ha a 5-ös értéket szúrjuk be:
A műveletigáy ekkor átlagos ill. legrosszabb esetbe is a fa magasságával lesz egy agyságredbe, ami elemű fa esetébe log. Tehát AT( = MT( = Θ(log. Max: Ebbe az esetbe csak kiolvassuk a gyökérbe lévő értéket. DelMax: A gyökérbe lévő értéket kiolvassuk, majd a szitfolytoos bejárás sorá utolsókét bejárt (jobb alsó) értéket rakjuk a gyökérbe, az utolsó csúcs kitörlődik. A kupac tulajdoság megtartása érdekébe a gyökérbe került értéket elemcserékkel lesüllyesztjük (midig a agyobb gyerekkel cserélve) a megfelelő helyre. Az alábbi kupaco láthatjuk eek működését: A műveletigéy itt is a fa magasságával aráyos: AT( = MT( = Θ(log. -----
Foglaljuk össze egy hatékoysági táblázatba a külöböző megvalósítások jellemzőit: Redezetle tömb. Redezetle tömb. Redezett tömb Kupac Isert Θ() Θ() Θ(log + Θ( = Θ( Θ(log DelMax Θ( Θ( Θ() Θ( log Max Θ( Θ() Θ() Θ() A Max műveletre a javítás utá már midhárom reprezetációba kostas lépésszámot kaptuk. A két fotosabb művelet az Isert és a DelMax a kupac reprezetációba kiegyesúlyozott módo hatékoyabb, mit az első kettőbe. Ezt akkor látjuk igazá, ha egy olya művelet sorozatot hajtuk végre, amelybe vegyese szerepel beszúrás és a maximum törlése. 6.3. A prioritásos sor felhaszálása redezésre Találtuk egy agyo egyszerű és talá meglepő algoritmust, amely az említett két műveletet egyelő számba hajtja végre működése sorá. RedPrior (s) Empty (p) s ε Read (s,x) Isert (p,x) IsEmpty (p) DelMax (p,x) Write (x) Az eljárás az s szekveciális iputról beolvasott értékeket sorba beteszi egy (kezdetbe üres) elsőbbségi sorba. Azutá pedig sorba kiveszi az elemeket az elsőbbségi sorból. A kiírt sorozat yílvá redezett lesz! Ez a redezés mide bizoyal meglepő, hisze ics bee egymásba ágyazott ciklus. Eek az a magyarázata, hogy az algoritmus szitjé el va takarva előlük a felhaszált adatszerkezet megvalósításáak módja. (Érdekes HF és vizsgakérdés aak a meggodolása, hogy milye redező algoritmust kapuk az egyes reprezetációk eseté!) Elemezzük most eek az algoritmusak a műveletigéyét midhárom reprezetáció eseté! Eek sorá a bevezetett műveletek egész sorát vesszük számba, ezáltal úgyevezett amortizációs elemzést hajtuk végre. Mivel csak agyságredekkel foguk számoli, midegy, hogy az összehasolítások maximális vagy átlagos számát határozzuk meg, hisze a két meyiség midig azoos agyságredű. Az alábbi elemzés alapjá joggal modhatjuk, hogy az elsőbbségi sorak kupaccal megvalósítása hatékoyabb a másik két ábrázolási módál!
Reprezetációtól függetleül igaz, hogy MT ( = T Empty + MT Isert ( + k = MT DelMax ( és AT(-re is hasoló összefüggés igaz. Számítsuk ki a feti kifejezés agyságredjét a három reprezetációba.. Redezetle tömb. Redezett tömb 3. Kupacos ábrázolás MT( = Θ() + Θ() + Θ( = Θ( MT( = Θ() + Θ( + Θ() = Θ( MT ( = Θ() + Θ(log + log +... + log Azt állítjuk, hogy eek az összegzések az eredméye agyságredbe azaz: MT( = Θ( log. ) ) log -es, Bizoyítás: A kiszámítadó összeget, mit a log x függvéy beírt téglalapjaiak területösszegét, tekitsük itegrál közelítő összegek. Ekkor + + log + log +... + log log x dx = l x dx = l = + x l x x = ( + )l( + ) ( + ) +,44 l l l = log = Θ( log [ ] [ ] = log +