Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Полезная методичка

.pdf
Скачиваний:
82
Добавлен:
01.04.2014
Размер:
1.09 Mб
Скачать

Ó ëÿ ì ó ó (i; pred[i]) ( êó÷ ó ë i ñò íî èòñÿ êîðí ûì ó ëîì).

Для кучи Фи он ччи опр лим осно ны оп р ции и пок м, что ля р ли ции к ой и них ост точно исполь о ния посл о т льности проц ур link è cut .

1. find_min(i; H) îï ð öèÿ í õî íèÿ êëþ÷ ó ë minkey , minkey у л с миним льным ключом.

2.insert(x; H) оп р ция о ля т к куч корн о р о, состоящ и инст нно о у л с ключом x . Посл это о мо т ыть н руш н ин ри нт 3. Для о осст но л ния мо т потр о ться посл о т льность проц ур link .

3.delete_min(x; H) оп р ция у л ния миним льно о эл - м нт и кучи Фи он ччи. Н хо им корн о р о с корн м

minkey . Отр м с помощью проц уры cut ñ õ ñûíî é ó ë minkey и писы м их список list . Упоря очим эл - м нты списк list поря к н у ы ния р н о (н прим р, с помощью ч рп чной сортиро ки).

Для о сп ч ния ин ри нт 3 поступ м сл ующим о р -ом. И л к м и списк list ìíî ñò î r1 ; :::; rt êîðí é ð í k . Åñëè t > 1 , ыполня м проц уру link(ri; ri+1); i = = 1; 3; 5; :::; t 1 и писы м получ нны корни р н k + + 1 ÷ ðï ê k + 1 , k = 0; 1; :::; 2 log n + 1 . Получим список list , котором н т у ло о ин ко о о р н . Ск ниру м с корн ы у лы (которы хр нятся списк list è ì ññè bucket(k); k = 0; 1; ; 2 log n + 1) , и с помощью проц уры link îñò í ëè ì èí ðè íò 3).

Сл у т м тить, что н т н о хо имости по р к ин - ри нт 2, поскольку он ыполн н.

Тру о мкость оп р ций ля кучи Фи он ччи

Для оц нки тру о мкости ок м н которы с ойст . Структурнных куч Фи он ччи со р ит мно ст о корн ых р ь , которы ин мич ски и м няются проц сс ыполн ния осно ных проц ур link(i; j) è cut(i) . ти корн ы р ья у о л т оряют

121

ин ри нт м 1-3, которы я ляются сущ ст нными ля получ ния оц нок р м ни ыполн ния оп р ций кучи.

ти ин ри нты мо ут н руш ться н пром уточных ш х н которых оп р ций кучи, о н ко, посл рш ния с х оп р ций, куч у о л т оря т ин ри нт м 1-3.

Ñ îéñò î 4.5.6. Ïðîö óðû link(i; j) è cut(i) òð óþò O(1)р м ни ля ыполн ния.

Сущ ст у т исимость м у числом проц ур link(i; j) è cut(i) при р от со структурой нных куч Фи он ччи.

Р ссмотрим функцию пот нци ло (potential function), опр -ля мую к к колич ст о корн ых р ь . К я проц ур link(i; j) ум ньш т число корн ых р ь н 1 и к я про- ц ур cut(i) у личи т их число н 1. О щ число ум ньш ний числ корн ых р ь куч Фи он ччи о р нич но н ч льным числом корн ых р ь ( m ) плюс о щ число их ум ньш ний. Сл ующ с ойст о оч и но.

С ойст о 4.5.7. Число проц ур link(i; j) р но к к м ксимум m плюс число проц ур cut(i) .

Î î í ÷èì ÷ ð G(k) миним льно число у ло , со р щихся по р с корн м у л р н k êó÷ Ôè îí ÷÷è.

Ñ îéñò î 4.5.8. G(k) F (k) .

Äîê ò ëüñò î.

Пусть w ó ë êó÷ Ôè îí ÷÷è ñ ð í îì k . Упоря очим сыно й у л w том поря к , котором пр ы ущи оп р ции присо иняли их к w , îò ð ííèõ ê ïî íèì. Äîê ì, ÷òî ð í i -

î ñûí ó ë w к к минимум i 2 .

Пусть y ñòü i -ûé ñûí ó ë w и р ссмотрим мом нт, ко

ó ë y присо иня м к у лу w . Ï ð ýòèì ó ë w им л к к минимум i 1 ñûíî é (ó ë w ìî èì òü è îëüø i 1 ñûíî é, íî îíè ûëè ó ë íû). Ò ê ê ê ýòî ð ìÿ y è w èì ëè î èí è òîò ð í , òî ó ë y ол н ыл им ть к к минимум i 1 ñûíî-é. Ç ì òèì, ÷òî òî ð ìÿ ó ë y пот рял н ол о но о сын (ин ри нт 2), поэтому у л y ол н им ть к к минимум i 2 ñûíî é.

122

Ïî ð î ñ êîðí ì ó ë w со р ит к к минимум

1 + G(1) + G(2) + ::: + G(k 2)

у ло , поэтому

G(k) 1 + G(1) + G(2) + ::: + G(k 2)

è ïî ñ îéñò ó 4.5.2. êëþ÷ ì, ÷òî G(k) F (k) .

2

Ë ìì 4.5.1. Ì êñèì ëüíî î ìî íûé ð í ëþ î î ó ë êó÷ Ôè îí ÷÷è ð í 2 log n + 1 .

Äîê ò ëüñò î.

Ò ê ê ê íèê êî ïî ð î í ìî ò ñî ð òü îëüø , ÷ ì n у ло , и по с ойст м 4.5.1.,4.5.2.,4.5.8. ыполняются н р нст

k 1

n G(k) F (k) 2 2 :

Ло рифмируя, получим 2 log n + 1 k . Ò êèì î ð îì, ì ê- ñèì ëüíî î ìî íûé ð í ëþ î î ó ë êó÷ Ôè îí ÷÷è ð í

2 log n + 1 .

2

Ñë óþù ñ îéñò î ñë ó ò è èí ðè íò 3 è ë ììû 4.5.1..

С ойст о 4.5.9. Куч Фи он ччи состоит и н ол ч м и 2 log n + 1 êîðí ûõ ð ü .

Восст но л ни ин ри нт 2

Äëÿ îññò íî ë íèÿ èí ðè íò 2 ó ì õð íèòü ëÿ ê î î ó ë i ополнит льный ин кс lost(i) , который опр лим сл ующим о р ом:

lost(i) : ëÿ êîðí î î ó ë lost(i) = 0 ;

ëÿ í êîðí î î ó ë lost(i) р н числу сыно й, которы у л i ïîò ðÿë, ïîñë òî î, ê ê ñò ë í êîðí ûì ó ëîì.

123

Í ÷ ëüí ÿ ïðîö óð cut ìî ò ïîðî èòü ðó è ïðîö óðû cut , которы н о м поро нными проц ур ми cut . У лы к которым прим ня тся проц ур cut у м хр нить списк list .

Восст но л ни ин ри нт 2 осущ ст ля тся сл ующим о р -ом: сли н ч ни lost(i) = 2 , òî ê ó ëó i ïðèì íèì ïðîö óðó cut(i) . Â ñ îþ î÷ ð ü ïðîö óð cut(i) ìî ò ïîðî èòü ïðîö ó- ðó cut(pred(i)) ëÿ ó ë k = pred(i) , ñëè lost(k) = 2 и т. . о т х пор, пок н у т ыполн н ин ри нт 2. У лы, к которым прим н ны н ч льн я проц ур cut и посл о т льность поро-

ííûõ ïðîö óð cut , т к их р н и, сохр ня м списк list .

Восст но л ни ин ри нт 3

Èí ðè íò 3 òð ó ò, ÷òî û íèê êèõ êîðí ûõ ó ë í èì ëè

î èí êî î î ð í . Äëÿ ïî ð êè èí ðè íò 3 î èì èí êñ bucket(k) ëÿ ëþ î î î ìî íî î ð í k = 0; 1; 2; :::; k = 2 log n +

+1:

bucket(k) : ëÿ ê î î í êîðí î î ó ë i êó÷è Ôè îí ÷- ÷è ð í k ïîë ì bucket(k) = 0 è bucket(k) = i , ñëè

н который корн ой у л i èì ò ð í , ð íûé k ;

Í ÷ ëüí ÿ ïðîö óð link мо т поро ить посл о т льностьру их проц ур link , которы н о м поро нными проц у- р ми link .

Ïð ïîëî èì, ÷òî, ð îò ÿ ñ êó÷ é Ôè îí ÷÷è, ìû ñî ëè êî- ð íü j ð í k è êó÷ ñî ð èò ðó îé êîðí îé ó ë i ýòî îð í k . То мы по торя м сл ующую проц уру ля по -р ки ин ри нт 3: ыполня тся проц ур link(i; j) , котор я о ъ иня т корн ых р с корн ыми у л ми р н k íî î êîðí î ð î ñ êîðí ì ð í k + 1 . Пусть l êîð íü íî î î ð . Åñëè bucket(k + 1) = t 6= 0 , òî ñð è í îð êîð- í ûõ ð ü èì òñÿ êîðí î ð î ñ êîðí ì t ð í k + 1 . Выполня м сно проц уру link(l; t) о ъ н ния ух корн ыхр ь с корнями р н k + 1 î íî êîðí î ð î ñ êîðí ì ð í k + 2 è ñíî ïðî ðÿ ì í ÷ íè bucket(k + 2) и т. . тот проц сс ыполн ния проц ур link про ол тся о т х пор, пок н у т сохр н н ин ри нт 3. Посл ыполн ния к ой проц -уры link(i; j) н о хо имо корр ктиро ть эл м нты структурынных.

124

Р ссмотрим проц сс по р ки ин ри нт 3. Н рисунк , при-

нном ни , рисунку a) соот тст у т куч Фи он ччи. Поло-им ключ к о о у л i êó÷è Ôè îíí ÷è ð íûì i ( key(i) = i ).

 

 

 

1

 

n

 

 

 

 

 

7

 

n

 

1

n

 

 

 

KA

 

 

 

 

 

 

 

 

 

7

 

 

 

 

KA

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A

 

 

 

 

 

A

 

 

 

 

 

 

 

 

 

 

 

 

 

A

 

2

n

 

3 oSn

 

8 n

 

 

 

2 n 3

Son

 

 

 

 

 

 

 

 

S

n9 n

 

 

 

 

 

 

S

4

n 5

 

 

n

 

6

 

 

4

n

5

n 6

 

 

a)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

b)

 

 

 

 

 

 

 

1

 

n

 

 

 

 

7

n

 

 

 

 

 

 

 

 

 

 

KA

 

 

 

 

 

 

 

@I

 

 

 

 

 

 

 

 

 

 

 

A

 

 

n

 

 

 

@

n c)

 

 

 

2

n

 

3

 

 

 

 

9

 

 

 

 

 

 

 

 

 

 

 

oS

 

 

 

n

Æ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

n 5

nS6 n 8

10 n

 

 

 

 

 

 

 

 

 

 

 

3

1

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

iP

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6PP

PPP

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

n oSn

 

 

Son

 

 

d)

 

 

 

 

n

 

 

 

 

S

n 8

 

n

S

n

 

 

 

 

4

 

5

n

6

 

9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10 n

 

 

 

7 n

8 n

n9 n

10 n

Пр поло им, что мы о ля м к куч у л с ключом 10. Ку- ч у со р ит ру ой корн ой у л 9 р н 0. Выполня м link(10; 9) . Получим колл кцию корн ых р ь , и о р нную н рисунк ), котор я со р ит р куч с корнями 7 и 9 р н 1. Сно ыполня м проц уру link(7; 9) ля у ло 7 и 9 и получ м колл кцию р ь , и о р нную н рисунк с). Д

125

р с корн ыми у л ми 1 и 7 им ют о ин ко ый р н , р ный 2. О ъ иня м их но о корн о р о (рисунок d)) с корн м у л 1 с помощью проц уры link(1; 7) . Ин ри нт 3 ыполн н.

С ойст о 4.5.10. Если мы о ля м но о корн о р о ку- чу Фи он ччи, это мо т потр о ть ыполн ния поро н- ных проц ур link ля по р ки ин ри нт 3. Вр мя, н о хо и- мо ля ыполн ния этих проц ур пропорцион льно о щ му числу проц ур link .

Ð ëè öèÿ îï ð öèé êó÷è Ôè îí ÷÷è

Н ря у с осно ными оп р циями, нными ля кучи Фи он ч- чи, опуск ются сл ующи оп р ции:

êó÷è.delete(i; H) оп р ция у л ния прои ольно о у л i è

decrease_key(i; value; H) îï ð öèÿ óì íüø íèÿ êëþ÷ ó - ë i í í ÷ íè value .

increase_key(i; value; H) îï ð öèÿ ó ëè÷ íèÿ êëþ÷ ó ë i í í ÷ íè value .

 

decrease_key(i; value; H) îï ð öèÿ óì íüø íèÿ êëþ÷ ó ë

i

í í ÷ íè value . Посл то о, к к мы ум ньшили ключ у л

i

í í ÷ íè value , ê ûé ó ë ïî ð ñ êîðí ì ó ë i

у о л т оря т с ойст у упоря оч нности (ин ри нт 1), но ля у - л j = pred(i) с ойст о упоря оч нности мо т н рушится. Если

key(j)

key(i) , то мы ост н ли мся, ин ч мы ыполня м оп -

ð öèþ

cut(i) . Мо ифициру м, сли н о хо имо, н ч ни minkey

: ñëè

key[minkey] > key(i) , òî ïîë ì key[minkey] = key(i)

( ч стном случ , сли key(i) = i , òî minkey = i , сли мы мо-ифициру м minkey ). З т м н о хо имо о сп чить ыполн ни ин ри нт 2, поскольку ыполн н проц ур cut(i) .

Проц сс о сп ч ния ин ри нт 2 поро т но ы корн ыр ья с но ыми корнями. Бу м хр нить списк list корни но-ых корн ых р ь и их р н и, прич м list хр нятся корнис х но ых корн ых р ь , о р о нных р ульт т н ч льных и поро нных проц ур cut . Список list упоря очим по о - р ст нию р н о у ло с исполь о ни м ч рп чной сортиро ки.

126

З т м, ко мы о сп чили ин ри нт 2, н чин м по оч р и у лять но ы корни и списк list . З м тим, что ля то о что ысписк list отсутст о ли у лы о ин ко о о р н поступ м по пр ил м, и ло нным при опис нии оп р ции delete_min(i; H) . Пусть k н который корн ой у л списк list ð í l . Åñëè bucket(l) = 0 , то у ля м эл м нт и списк list и п р хо им к сл ующ му эл м нту списк . Если bucket(l) = i 6= 0 , òî êîðí îé ó ë ð í l сть у куч Фи он ччи. Пусть j ó ë ð í-l куч Фи он ччи. Выполня м проц уру link(i; j) , котор я поро т посл о т льность ру их проц ур link (по р к ин ри нт 3). Если ин ри нт 3 ыполн н, то п р хо им к о р -отк оч р но о у л и списк list .

Ал оритм к нчи т р оту то , ко список list ïóñò.

Р ссмотрим прим р

 

 

ыполн ния оп р ции

decrease_key(i; value; H)

ëÿ

êó÷è

Ôè îí ÷÷è, è î ð ííîé

íè .

 

 

 

 

 

 

 

 

 

 

 

 

 

[0] 6

[0]

[0]

 

 

>

 

 

3 I@

 

Æ

13Æ

10Æ

 

 

 

 

 

 

 

 

 

Æ [0]

 

6

I@

 

 

 

 

 

6 @

 

 

 

 

@

 

 

 

 

 

 

12

[0]

 

5

 

 

 

 

 

15

11

 

 

 

7

8

 

 

Æ ÆoS

 

ÆÆÆ

 

 

Æ

 

[0]

[0]

[0]

 

[0]

[0]

14

 

S

[1]

 

 

 

 

 

 

 

 

 

 

 

Æ]J

 

 

 

 

 

 

 

 

 

 

 

 

J [1]

 

 

 

 

 

 

 

 

 

 

 

 

18Æ]J

 

 

 

 

 

 

 

 

 

 

 

20 24

 

 

 

 

 

 

 

 

 

 

 

 

J

 

 

 

 

 

 

 

 

 

 

 

Æ Æ

 

 

 

 

 

 

 

 

 

 

 

[0]

[0]

Пусть н о хо имо ыполнить оп р цию decrease_key(i; value; H)ëÿ ó ë i с ключ ым н ч ни м 24. Пусть key[i] = i; key[i] = 24 è í ÷ íè value ð íî 22. Èì ì key[i] = 2 . Äëÿ ó ë i í õî èì j = pred[i]; key[j] = 18 . Поскольку key[i] < key[j] , òî ïðèì íèì ïðîö óðó cut(i) ê ó ëó i ñ êëþ÷ ûì í ÷ íè ì key[i] = 2 .

 ð óëüò ò èì ì êîëë êöèþ êîðí ûõ ð ü , è î ð í- íóþ íè .

127

 

[0]3 6

13[0]

 

[0]10

[0]2

>

 

I@

Æ

 

Æ

 

Æ

Æ

 

 

 

 

 

 

Æ [0]

 

6

 

I@

 

@

 

11 12 [0]

 

 

6

 

 

 

 

@

 

5

 

 

15

Æ ÆoS

ÆÆÆ

 

Æ

 

7

8

 

 

 

 

14

[0]

[0]

[0]

[0] [0]

S

[1]

 

 

 

 

 

 

 

 

Æ

Z}

Z

18 [2]

Æ 20Æ

[0]

Мо ифициру м н ч ни миним льно о ключ : minkey = 3 - м ня м н но о н ч ни minkey = 24 . Пом щ м список list у л с ключом 2; list = f24g . Поскольку ршин j = pred[i] с ключом 18 им т н ч ни ин кс lost(j) = 2 (он пот рял ух сыно й), то н о хо им по р к ин ри нт 2. то осущ ст ля-тся с помощью проц уры cut(j) ля у л с ключом 18. Список list = f24;18g . В с ою оч р ь, эт проц ур cut(j) поро ит про- ц уру cut(pred[j]) ля у л k = pred[j] с ключ ым н ч ни м 14. Поскольку lost(pred[k]) = 1 , то ин ри нт 2 ыполн н.

Список list со р ит ключи: list = f24; 18; 14g .

В ыполн нных проц ур х cut мо ифик ция миним льно он ч ния ключ н исполь у тся, поскольку ключ у л minkey со-р ит пок н им ньш н ч ни . В р ульт т им м сл ующий н ор р ь : a) Колл кция корн ых р ь , получ нн я р -ульт т н ч льной проц уры cut(i) ля у л с ключом 2 и поро-

нных проц ур cut ля по р ки ин ри нт 2. b) Корн ыр ья, соот тст ующи у л м и списк list . c) Колл кция кор- н ых р ь , состоящ я и о но о р (список list ), получ н- н я р ульт т слияния р ь с корнями о ин ко о о р н .

При м проц уру слияния р ь и списк list .

128

[0]

[0]

 

3

n 6

n

 

I@

 

6@

 

 

@

 

5n

[0][0] [0]n7 n8

a)

[0]

[0]

[0]

 

2

n 14

n

18

n

 

 

 

 

 

6

 

 

 

 

n

 

 

20

 

 

[0]

 

b)

[0][0]

13

n

 

10

I@n

 

 

 

 

 

 

 

 

@

 

6

 

 

@

 

 

 

 

 

n

n

12 n

15

11

[0]

 

[0]

 

[1]

 

2

n

 

 

 

I@

 

 

@

 

 

 

n

@

 

n

 

 

14

18

 

 

 

6

 

 

 

 

n

 

 

20

 

c)

 

Упоря очи м у лы списк list поря к н у ы ния р н о у ло . Поскольку ин ри нт 2 ыполн н, то н чин м по оч р и и л к ть эл м нты и списк list = f24; 14; 18g .

Корн ы р ья, соот тст ующи ключ м у ло и списк list , и о р ны ыш н рисунк ) и хр нятся от льно от кучи, и о р нной ыш н рисунк a).

И л к м и списк list ó ëû r1 = 24; r2 = 14 р н 0. Выполня м проц уру link(24; 14) , получим корн о р о с корн м

i = 24; key[i] = 2 ð í 1.

В р ульт т ыполн ния проц уры link(18; 24) получим кор- н о р о с корн м i = 24 ð í 2; key[i] = 2 . Í ýòîì ê í÷è-

тся о р отк списк list . Т п рь н о хо имо про сти слияни н ор корн ых р ь и списк list è í îð êîðí ûõ ð -ü , îïð ëÿ ìûì ì ññè îì bucket .

129

Èí êñ bucket(k); k = 1; 2; : : : ; 9 приним т н ч ния: bucket(0) = 6;

bucket(1) = 13; bucket(2) = 10; bucket(3) = 3;

bucket(i) = 0; i = 4; 5; :::;9:

Н хо им списк list корн о р о миним льно о р н . Ему соот тст у т кор нь i = 24; key[i] = 2; rank[i] = 2 . Ïîë ì k = rank[i] = 2 . Ò ê ê ê bucket[k] = 10 , то н ор корн ых р ь им тся р р н 2, у лы которых р ны i = 24 , j =

= bucket[k] = 10 .

Выполня м проц уру link(i; j) ëÿ ó ëî 24 è 10.

ò í ÷ ëüí ÿ ïðîö óð link ïîðî ò ðó è ïðîö óðû link (по р к ин ри нт 3), которы проиллюстриро ны ни-н рисунк : a) Колл кция р ь посл слияния р ь с корнями р н 2. b) Колл кция р ь , получ нн я р ульт т слияния р ь с корнями р н 3.

 

 

3

m

 

 

 

 

 

13

 

m

 

2

 

kQm

 

 

 

 

 

oS

 

 

 

 

 

 

 

 

 

 

 

OC Q

Q

 

 

 

S

 

 

 

 

 

 

 

m7

 

 

C

 

 

a)

 

 

m m m6 m

15

 

 

MBm

 

m

KAm

5

 

7

8

 

 

 

 

 

 

 

 

10

 

 

14

 

 

18

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B

 

 

 

 

A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B

 

 

 

 

 

A

 

 

 

 

 

 

 

 

 

 

11

m

 

12

m

 

 

 

20

m

 

 

 

 

iP

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

2

QkmPPP

PP

 

 

 

 

 

6

 

 

 

 

 

 

 

CO

Q

Q

 

P

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

AKm

 

PPP3

 

 

 

 

 

 

 

 

710 MBm14

m18

 

 

m 13

mb)

 

 

B

 

 

 

 

A

 

 

 

 

 

oS

 

 

 

 

 

 

m

B

m

 

 

 

A

m

 

 

S

 

 

 

 

11

 

12

 

 

 

20

 

m m m m

 

 

 

 

 

 

 

 

 

 

 

 

 

5

7

 

 

8

 

15

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

130

 

 

 

 

 

 

 

 

 

 

Соседние файлы в предмете Структуры и алгоритмы обработки данных