Algoritmuselmélet
Kupac, Dijkstra kupaccal
Katona Gyula Y.
Számítástudományi és Információelméleti Tanszék Budapesti M ˝uszaki és Gazdaságtudományi Egyetem
4. el ˝oadás
Katona Gyula Y. (BME SZIT) Algoritmuselmélet 4. el ˝oadás 1 / 12
Adatszerkezetek
Definíció
Egy adatszerkezet elemek egy halmazának tárolása, az elemek
közötti kapcsolat módja és az elemek kezeléséhez tartozó m ˝uveletek összessége.
Példák:
Tömb – M ˝uveletek: szelekciós függvény
Láncolt lista – M ˝uveletek: els ˝o, következ ˝o, keres, beszúr, beszúrMögé, töröl
Sor – M ˝uveletek: els ˝o, sorba, sorból
Bináris fa adatszerkezet
Láncolt lista
x
Bináris fa
bal fiú jobb fiú
x
x x x x x x x x
x x
M ˝uveletek: gyökér, bal-fiú, jobb-fiú, keres, beszúr, töröl
Katona Gyula Y. (BME SZIT) Algoritmuselmélet 4. el ˝oadás 3 / 12
Kupac adatszerkezet
Egész számok egy S véges részhalmazát szeretnénk tárolni, hogy a beszúrás és a minimális elem törlése (mintör) hatékony legyen.
Alkalmazások:
Jobok indítása
Több rendezett halmaz összefésülése Gyors rendezési algoritmus
Teljes bináris fa:
gyökér
levelek
Bináris fa ábrázolása tömbbel
A fa csúcsai az A[1 : n] tömb elemei.
Az A[i] csúcs bal fia A[2i], a jobb fia pedig A[2i +1].
=⇒ A[j] csúcs apja A[bj/2c]
4
5 9
8
2
6 7
2 4 6 8 5 9 7
Kupac tulajdonság: apa < fia
Katona Gyula Y. (BME SZIT) Algoritmuselmélet 4. el ˝oadás 5 / 12
Kupacépítés
f
1f
2a
c
b
f1 és f2 kupacok
kupacol(f)
{ Ha min{a,b} < c, akkor min{a,b} és c helyet cserél
Ha a c elem a-val cserélt helyet, akkor kupacol(f1), ha b-vel, akkor kupacol(f2) }
c addig megy lefelé, amíg sérti a kupac tulajdonságot.
Lépésszám: Ha l a fa szintjeinek száma, akkor ≤ l − 1 csere és ≤ 2(l − 1) össze- hasonlítás
kupacépítés(f)
{ Az f fa v csúcsaira lentr ˝ol felfelé, jobbról balra kupacol(v). }
Kupacépítés költsége
n-csúcsú bináris fában:
1. szint: 1 csúcs 2. szint: 2 csúcs 3. szint: 22 csúcs
...
l − 1. szint: 2l−2 csúcs
l-edik szint: ≥ 1 és ≤ 2l−1 csúcs
=⇒ n ≥ 1 +Pl−2
i=02i = 2l−1 =⇒ l ≤ 1 +log2n
Az i-edik szinten lev ˝o v csúcsra kupacol(v) költsége legfeljebb l −i csere és legfeljebb 2(l − i) összehasonlítás.
A cserék száma ezért összesen legfeljebb Pl
i=1(l − i)2i−1. j = l − i (azaz i = l − j) helyettesítéssel
l−1
X
j=0
j2l−j−1 = 2l−1
l−1
X
j=1
j/2j
Katona Gyula Y. (BME SZIT) Algoritmuselmélet 4. el ˝oadás 7 / 12
Kupacépítés költsége
1/2
1/4 1/4
1/8 1/8 1/8
...
1 2l−1
1 2l−1
1
2l−1 . . . 2l−11
< 1 < 1/2 < 1/4 · · · ≤ 1
2l−1
2l−1
l−1
X
j=1
j/2j < 2l ≤ 2n.
Tétel
Kupacépítés költsége: O(n)
MINTÖR
A minimális elem az f gyökérben van, ezt töröljük.
A f-be tesszük a fa utolsó szintjének jobb széls ˝o elemét, majd kupacol(f).
5 9
4
2
8
6
2 4
5 9
8
6
2 5
8 9
4
6
Költség: O(l) = O(log2n)
Katona Gyula Y. (BME SZIT) Algoritmuselmélet 4. el ˝oadás 9 / 12
BESZÚR
Új levelet adunk a fához (ügyelve a teljességre), ide tesszük az s elemet. Ezután s-et mozgatjuk felfelé, mindig összehasonlítjuk az apjával.
5 9
4
2
8 1
6
5 9
4
2
8 6
1
5 9
4
8 6
1
2
Költség: O(l) = O(log2n)
Dijkstra algoritmusa éllistával
Ha kevés él van =⇒ gráfot éllistával tároljuk.
V\KÉSZ csúcsait kupacba rendezve tartjuk a D[ ] érték szerint.
A kupacépítés O(n) költség, a (2) ciklusban minimumkeresést O(logn) költség ˝u MINTÖR végrehajtásával számoljuk.
A D[ ] értékek újraszámolását és a kupac-tulajdonság helyreállítását csak a választott csúcs szomszédaira kell elvégezni.
Minden csúcsot pontosan egyszer választunk ki, és a szomszédok számának összege e. =⇒ Összid ˝oigény O((n +e)logn).
S ˝ur ˝u gráfokra: d-kupac.
=⇒ O(n +nd logd n+ elogd n)
Ha n1,5 ≤ e ≤ n2 és legyen d = de/ne =⇒ d ≥ √
n =⇒ logd n ≤ 2.
=⇒
O(n+nd logd n+elogd n) = O(n+nd+e) = O(n+n·e/n+e) = O(e).
Dijkstra irányítatlan gráfokra is m ˝uködik.
Katona Gyula Y. (BME SZIT) Algoritmuselmélet 4. el ˝oadás 11 / 12
A legrövidebb utak nyomon követése
Minden pontra tárolunk és karbantartunk egy P[x] csúcsot is, ami megadja egy az eddig ismert hozzá vezet ˝o legrövidebb úton az utolsó el ˝otti csúcsot.
Kezdetben P[v] := s minden v ∈ V-re.
A (3) ciklus belsejében, ha egy küls ˝o w csúcs D[w] értékét megváltoztatjuk, akkor P[w] := x.
Lépésszám: O(n2)