Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:

Hasonló előadás


Az előadások a következő témára: "Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:"— Előadás másolata:

1 Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő: Imre Mihály, műszaki informatikus hallgató

2 Binomiális várakozósor A binomiális várakozósor nem egy heap-ordered fa, hanem egy heap-ordered fák gyűjteménye, azaz erdő. 2 B 0 B 1 B 2 B 3 B 4 Minden magassághoz egy binomiális fa tartozik. A B k úgy keletkezik, hogy egy B k-1 binomiális fát egy másik B k-1 binomiális fa gyökeréhez illesztünk. A B k áll egy gyökérből és a hozzá illesztett B 0, B 1,..., B k-1 gyerekekből.

3 Binomiális várakozósor A k magasságúnak pontosan 2 k csúcsa van, és a d mélységben csúcspont található. B k magassága k, gyökerének k gyereke van. Ha előírjuk a heap sorrendet a binomiális fára és bármely magasságra egyetlen binomiális fát engedünk meg, akkor bármely méretű várakozó sort egyértelműen tudunk ábrázolni egy binomiális fa gyűjteménnyel. Pl. egy 13 méretű priority queue ábrázolható a B 3, B 2, B 0 erdővel. Amit írhatunk 1101, ami nemcsak a 13 bináris reprezentációja, de kifejezi azt a tényt is, hogy a B 3, B 2, B 0 jelen van, a B 1 pedig nincs. 3

4 Binomiális várakozósor Pl. egy 6 elemű priority queue:

5 Binomiális várakozósor műveletek A minimum elemet az összes fa gyökerének megvizsgálásával kereshetjük meg. Mivel legfeljebb log N különböző fa van, a minimumot O(log N) idővel találhatjuk meg. De meg is jegyezhetjük a minimumot, ha más műveletek során aktualizáljuk. 5

6 Binomiális várakozósor műveletek Két binomiális fa összefésülése (merge) Mivel két binomiális fa összefésülése konstans időt igényel, és O(log N) binomiális fa van, a legrosszabb esetben is O(log N) idejű. A műveletet hatékonyabbá tehetjük, ha a fákat magasságuk szerint sorrendbe tesszük.

7 Binomiális várakozósor műveletek Az insert az összefésülés speciális esete. Létrehozunk egy egy csúcspontú fát és összefésülünk. wc: O(log N) Pl. 1, 2, 3,...,

8 Binomiális várakozósor műveletek DeleteMin: megkeressük a minimum gyökerű fát: B k, az eredeti: H. Kivesszük a H erdőből B k fát  H’. Eltávolítjuk a B k gyökerét:  B 0, B 1,..., B k-1 : H’’. Merge: H’ és H’’. Pl.: H3 :H3 :

9 Binomiális várakozósor műveletek A 12 minimális elem eltávolítása: H’ :H’’ : Merge: H’,H’’ : Megkeresés, kettévágás O(log N), merge O(log N) :  O(log N)

10 A binomiális várakozósor implementációja A DeleteMin-hez a gyökér összes alfájának gyors megkeresése kell. Minden csúcs gyerekeit láncolt listában tároljuk és minden csúcsnak lesz pointere az első gyerekére (ha van). A gyerekeket az alfáik magassága szerint sorrendbe rakjuk. Két fa könnyű összefésülését is biztosítani kell. Csak akkor fésülhető össze két binomiális fa, ha azonos a méretük. A fa méretét a gyökérben tárolni kell. Az összefésülésnél az egyik a másik gyereke lesz. Mivel ez az új fa az utolsó gyerek lesz (hiszen ez a legnagyobb alfa), ezért minden csúcs utolsó gyerekét is tárolnunk kell. 10

11 A binomiális várakozósor implementációja Az egyik megoldás a körkörös (circular) duplán láncolt lista. Ebben a listában az első gyerek bal testvére az utolsó testvér. Az utolsó gyerek jobb testvére lehetne az első gyerek, de könnyebb azt nil-nek definiálni. Így könnyebb kitalálni, hogy ez a gyerek az utolsó-e. Tehát egy binomiális fa minden csúcsa tartalmazza az adatot, az első gyereket, a bal és a jobb testvért és a gyerekek számát (amit Rank -nak hívunk). Mivel a binomiális queue fák listája, az adatszerkezetre hivatkozhatunk a legkisebb fára mutató pointerrel. 11

12 A binomiális várakozósor implementációja Pl.: H

13 A binomiális várakozósor implementációja Típus deklaráció: Type TreePtr = ^TreeNode; TreeNode = Record Elem : Elemtipus; Baltestver : TreePtr; Jobbtestver : TreePtr; Elsogyerek : TreePtr; Rank: integer; end; PQ := TreePtr; 13

14 A binomiális várakozósor implementációja Két azonos méretű binomiális fa összefésülése:

15 A binomiális várakozósor implementációja Function MergeTree(T1, T2 : PQ) : PQ; Begin If T1^.elem > T2^.elem Then Swap(T1, T2); If T1^.Rank= 0 Then T1^.elsogyerek := T2 Else Begin T2^.baltestver := T1^.elsogyerek^.baltestver; T2^.baltestver^.jobbtestver : = T2; T1^.elsogyerek^.baltestver : = T2; End; T1^.Rank : = T1^.Rank + 1; MergeTree := T1; End; 15

16 A binomiális várakozósor implementációja Két binomiális queue összefésülése (merge) rekurzívan: Az Extract(T,H) eltávolítja a H első fáját és azt a T-be teszi. Feltesszük, hogy a legkisebb binomiális fa a H 1 –ben és nem a H 2 –ben van. Eltávolítjuk a H 1 első fáját és ehhez hozzáadjuk a maradék H 1 és H 2 összefésülésének az eredményét. 16

17 A binomiális várakozósor implementációja Function Merge(H1, H2 :PQ) : PQ; Var H3, T1, T2, T3 : PQ; Begin If H1 = nil Then Merge = H2 Else If H2 = nil Then Merge = H1 Else If H1^.Rank < H2^.Rank Then Begin Extract(T1, H1); H3 = Merge(H1, H2); T1^.baltestver = H3^.baltestver; H3^.baltestver^.jobbtestver = nil; T1^.jobbtestver = H3; H3^.baltestver = T1; Merge = T1; End 17

18 A binomiális várakozósor implementációja Else If H2^.Rank < H1^.Rank Then Merge = Merge(H2, H1) Else Begin Extract(T1, H1); Extract(T2, H2); H3 = Merge(H1, H2); T3 = MergeTree(T1, T2); Merge = Merge(H3, T3); End End; DecreaseKey: felbugyborékoltatás, szülő pointer Delete: DecreaseKey + DeleteMin 18


Letölteni ppt "Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:"

Hasonló előadás


Google Hirdetések