Ëåêöèÿ 15

Äîáàâëåíèå ýëåìåíòîâ ê äâîè÷íîé êó÷å



Äâîè÷íàÿ êó÷à (ïèðàìèäà, ñîðòèðóþùåå äåðåâî) — ýòî äâîè÷íîå äåðåâî, óäîâëåòâîðÿþùåå ñëåäóþùèì óñëîâèÿì:

1) Çíà÷åíèå â êàæäîì óçëå äåðåâà íå ìåíüøå, ÷åì çíà÷åíèå â ëþáîì èç ïîòîìêîâ ýòîãî óçëà;

2) Êàæäûé ëèñò èìååò ãëóáèíó d èëè d-1, ãäå d – ãëóáèíà äåðåâà;

3) Ñàìûé ãëóáîêèé ñëîé çàïîëíÿåòñÿ áåç ïðîïóñêîâ.



Ïðè äîáàâëåíèè ýëåìåíòà â êîíåö ìàññèâà òîò ìîæåò ïåðåñòàòü áûòü äâîè÷íîé êó÷åé (î äâîè÷íûõ êó÷àõ ñì. ïðåäûäóùóþ ëåêöèþ). Äëÿ âîññòàíîâëåíèÿ ñâîéñòâà 1 äâîè÷íîé êó÷è (çíà÷åíèå â óçëå áîëüøå çíà÷åíèÿ â ëþáîì èç åãî ïîòîìêîâ) ìîæåò ïîòðåáîâàòüñÿ ïåðåìåñòèòü ýòîò ýëåìåíò ââåðõ ïî äåðåâó. Äëÿ ýòîãî çíà÷åíèå â äîáàâëåííîì óçëå ñðàâíèâàåòñÿ ñî çíà÷åíèåì â ðîäèòåëüñêîì óçëå è, â ñëó÷àå íàðóøåíèÿ ïîðÿäêà (òî åñòü åñëè îíî áîëüøå, ÷åì çíà÷åíèå â ðîäèòåëüñêîì óçëå) îáìåíèâàåòñÿ ñî çíà÷åíèåì â ðîäèòåëüñêîì óçëå. Ýòî äåéñòâèå ïðîèçâîäèòñÿ äî òåõ ïîð, ïîêà äîáàâëåííîå çíà÷åíèå íå ïîäíèìåòñÿ ââåðõ íàñòîëüêî, ÷òî çíà÷åíèå â ðîäèòåëüñêîì óçëå îêàæåòñÿ áîëüøå íåãî, èëè ïîêà íå äîñòèãíåò êîðíÿ äåðåâà.

Ïðîöåäóðà äîáàâèòü ýëåìåíò â äâîè÷íóþ êó÷ó <âõ: êó÷à, E: ýëåìåíò>

êó÷à.ìàññèâ[êó÷à.ðàçìåð] := E

siftUp<âõ: êó÷à.ìàññèâ, êó÷à.ðàçìåð>

êó÷à.ðàçìåð := êó÷à.ðàçìåð + 1

Êîíåö ïðîöåäóðû

Ïðîöåäóðà siftUp<âõ: ar: ìàññèâ, n: èíäåêñ ýëåìåíòà>

! Ïîäíèìàåò ýëåìåíò ñ èíäåêñîì n ââåðõ ïî äåðåâó, ïîêà çíà÷åíèå

! íå îêàæåòñÿ ìåíüøå, ÷åì â ðîäèòåëüñêîì óçëå (èëè íå äîñòèãíåò êîðíÿ)

Öèêë ïîêà parent(n) >= 0 è ar[n] > ar[parent(n)] âûïîëíÿòü

swap(ar, n, parent(n))

n := parent(n)

Êîíåö öèêëà

Êîíåö ïðîöåäóðû

Ñîðòèðîâêà HeapSort

Äâîè÷íàÿ êó÷à ìîæåò áûòü èñïîëüçîâàíà äëÿ ñîðòèðîâêè ìàññèâà áåç èñïîëüçîâàíèÿ äîïîëíèòåëüíîãî ìåñòà (in place). Ýòîò ìåòîä î÷åíü ïîõîæ íà ìåòîä ñîðòèðîâêè «ïóçûðüêîì», íî ìàêñèìàëüíûé ïóòü, êîòîðûé ïðîõîäèò «ïóçûðåê», èìååò äëèíó íå O(N), à O(log N).

Ñíà÷àëà ìàññèâ ïðåâðàùàåòñÿ â äâîè÷íóþ êó÷ó (ñëîæíîñòü àëãîðèòìà O(N)), çàòåì, ïîêà êó÷à íå ñòàíåò ïóñòîé, èç íåå óäàëÿåòñÿ ìàêñèìàëüíûé ýëåìåíò: ñîäåðæèìîå êîðíÿ êó÷è (òî åñòü ìàêñèìàëüíûé ýëåìåíò) ìåíÿåòñÿ ñ ñîäåðæèìûì ïîñëåäíåãî ýëåìåíòà äåðåâà, ðàçìåð äåðåâà óìåíüøàåòñÿ íà 1 è ïîëó÷èâøååñÿ äåðåâî ñíîâà ïðåâðàùàåòñÿ â äâîè÷íóþ êó÷ó. Ñëîæíîñòü ïîñëåäíåãî äåéñòâèÿ O(log N), ïðèìåíåíèå åãî êî âñåì ýëåìåíòàì ìàññèâà äàåò O(N log N).

Òàê êàê ìàêñèìàëüíûé ýëåìåíò êó÷è ïðè óäàëåíèè âñåãäà ïîìåùàåòñÿ â ÿ÷åéêó ñðàçó çà êó÷åé, òî â ìàññèâå áóäóò íàõîäèòñÿ äâîè÷íàÿ êó÷à è ñðàçó ïîñëå íåå îòñîðòèðîâàííûå ïî âîçðàñòàíèþ ýëåìåíòû. Ïîñëå òîãî, êàê êó÷à ñòàíåò ïóñòîé, âåñü ìàññèâ áóäåò çàíÿò ýëåìåíòàìè, îòñîðòèðîâàííûìè ïî âîçðàñòàíèþ.

Ýòîò ìåòîä ñîðòèðîâêè íàçûâàåòñÿ HeapSort (ïèðàìèäàëüíàÿ ñîðòèðîâêà, ñîðòèðîâêà êó÷åé).


Ïðîöåäóðà HeapSort<âõ: àr: ìàññèâ, N: öåëîå ÷èñëà>

! Äàíî: ìàññèâ ar íåîòñîðòèðîâàí, N – ðàçìåð ìàññèâà ar

! Íàäî: ìàññèâ ar îòñîðòèðîâàí

heapify(ar, N) ! Îêó÷èòü: ïðåîáðàçîâàòü ìàññèâ â äâîè÷íóþ êó÷ó

Öèêë ïîêà N > 0 âûïîëíÿòü

N := N -1 ! Óìåíüøèòü ðàçìåð êó÷è

swap(ar[N], ar[0]); ! Îáìåíÿòü

siftDown(ar, 0, N); ! Ïðîñåÿòü: ïåðåìåñòèòü ñîäåðæèìîå êîðíÿ âíèç,

! ïîêà äåðåâî ñíîâà íå ñòàíåò äâîè÷íîé êó÷åé

Êîíåö öèêëà

Êîíåö ïðîöåäóðû


Î÷åðåäü ñ ïðèîðèòåòàìè (priority queue).

Î÷åðåäü — FIFO (ñòåê - LIFO)

Î÷åðåäü ñ ïðèîðèòåòàìè — ýòî ñòðóêòóðà äàííûõ î÷åðåäü, ýëåìåíòû êîòîðîé óïîðÿäî÷åíû ïî ïðèîðèòåòó.

Ïðè äîáàâëåíèè ýëåìåíòà îí äîáàâëÿåòñÿ â î÷åðåäü ïåðåä òåìè ýëåìåíòàìè, ó êîòîðûõ ïðèîðèòåò íèæå, ÷åì ó íåãî.

Î÷åðåäü ñ ïðèîðèòåòàìè óäîáíî ðåàëèçîâûâàòü íà îñíîâå äâîè÷íîé êó÷è. Ãîëîâîé î÷åðåäü áóäåò êîðåíü äâîè÷íîãî äåðåâà. Ïðè óäàëåíèè ýëåìåíòà (êîðíÿ) èç î÷åðåäè ñ ïðèîðèòåòàìè äâîè÷íàÿ êó÷à ïåðåñòðàèâàåòñÿ äëÿ ñîõðàíåíèÿ ñâîåãî ñâîéñòâà (çíà÷åíèå â óçëå áîëüøå, ÷åì çíà÷åíèÿ âî âñåõ åãî ïîòîìêàõ).

Ïðèìåíåíèå priority queue â àëãîðèòìå Äåéêñòðû íàõîæäåíèÿ êðàò÷àéøåãî ïóòè â ãðàôå.

Ãðàô — ýòî ñòðóêòóðà äàííûõ, ñîñòîÿùàÿ èç íàáîðà âåðøèí è íàáîðà ðåáåð, êîòîðûå ìîãóò ñâÿçûâàòü ïàðó âåðøèí.

Ðåáðà ìîãóò áûòü îäíîíàïðàâëåííûå èëè äâóíàïðàâëåííûå.

Ðåáðà ìîãóò èìåòü âåñ (íàãðóçêó), êîòîðûé èíîãäà íàçûâàåòñÿ äëèíîé ðåáðà.  ýòîì ñëó÷àå ãðàô íàçûâàåòñÿ íàãðóæåííûì.

Àëãîðèòì Äåéêñòðû íàõîäèò êðàò÷àéøèé ïóòü ìåæäó äâóìÿ âåðøèíàìè â íàãðóæåííîì ãðàôå ñ ïîëîæèòåëüíûìè äëèíàìè ðåáåð.


Ïðèìåð èñïîëüçîâàíèÿ

Çàäà÷à latchup (çàùåëêà) → ãðàô → äëÿ âñåõ âåðøèí ãðàôà ïðîâåðÿëîñü, ÷òî åñòü ïóòü íå äëèííåå, ÷åì R (ìèíèìàëüíîå ðàññòîÿíèå äî çàçåìëåíèÿ).

Çàäà÷à ïîèñêà êðàò÷àéøåãî ïóòè â ìíîãîóãîëüíèêå ñ ïðåïÿòñòâèÿìè (the shortest way in polygon with obstacles).

(Êîãäà çàäà÷à íå èìååò òî÷íîãî ðåøåíèÿ (â âèäå ôîðìóëû) — ïðèáëèæåííîå ðåøåíèå èëè ñèìóëÿöèÿ (ìîäåëèðîâàíèå)).

Îïèñàíèå àëãîðèòìà Äåéêñòðû

Íàçîâåì ðàññòîÿíèåì óçëà Y ðàññòîÿíèå îò íà÷àëüíîãî óçëà äî óçëà Y. Áóäåì õðàíèòü åãî â dist[Y].

1. Ïðèñâàèâàåì êàæäîìó óçëó áåñêîíå÷íîå ðàññòîÿíèå.

2. Âîçüìåì â êà÷åñòâå òåêóùåãî óçëà íà÷àëüíûé óçåë. Âñå îñòàëüíûå óçëû ïîìåòèì êàê «íåïîñåùåííûå».

3. Äëÿ òåêóùåãî óçëà ðàññìîòðèì âñåõ ñîñåäåé (ñîåäèíåííûõ ñ íèì ðåáðîì). Âû÷èñëèì äëÿ êàæäîãî èç ñîñåäåé ïðîáíóþ äëèíó - äëèíó ïóòè ÷åðåç òåêóùèé óçåë (dist òåêóùåãî óçëà + âåñ ðåáðà, ñîåäèíÿþùåãî òåêóùèé óçåë è ñîñåäà) è, åñëè îíà ìåíüøå dist ñîñåäà, çàìåíèì dist ýòîãî ñîñåäà íà ýòó ïðîáíóþ äëèíó.

4. Ïîìå÷àåì òåêóùèé óçåë êàê «ïîñåùåííûé», óäàëÿåì èç ìíîæåñòâà íåïîñåùåííûõ óçëîâ è áîëüøå íå ðàññìàòðèâàåì.

5. Åñëè óçåë íàçíà÷åíèÿ îêàçûâàåòñÿ ïîìå÷åííûì êàê «ïîñåùåííûé» èëè åñëè íåò ïóòè êî âñåì íåïîñåùåííûì óçëàì, àëãîðèòì çàêàí÷èâàåò ðàáîòó.

6. Åñëè æå åñòü íåïîñåù¸ííûå óçëû ñ dist ìåíüøå, ÷åì áåñêîíå÷íîñòü, ñðåäè íèõ âûáèðàåòñÿ óçåë ñ íàèìåíüøèì dist, áåðåòñÿ â êà÷åñòâå òåêóùåãî è àëãîðèòì ïåðåõîäèò ê øàãó 3.

Èñïîëüçîâàíèå áèíàðíîé êó÷è â ðåàëèçàöèè àëãîðèòìà Äåéêñòðû

Ñíà÷àëà äîáàâèì â êó÷ó èñõîäíûé óçåë.

Çàòåì ïîñëåäîâàòåëüíî èçâëåêàåì èç êó÷è ýëåìåíò ñ íàèìåíüøèì çíà÷åíèåì è ðàññìàòðèâàåì åãî êàê òåêóùèé. Çàìåòèì, ÷òî íà ïåðâîì øàãå òåêóùèì áóäåò ñàì èñõîäíûé óçåë.

Äëÿ êàæäîãî ðàññìàòðèâàåìîãî òåêóùåãî óçëà âû÷èñëÿåì äëèíó ïóòè (èç èñõîäíîé âåðøèíû), ïðîõîäÿùåãî ÷åðåç íåãî, êî âñåì åãî ñîñåäÿì. Ýòà äëèíà ðàâíà ñóììå çíà÷åíèÿ â òåêóùåì óçëå è âåñó ðåáðà, ñîåäèíÿþùåãî òåêóùóþ è ñîñåäíþþ âåðøèíû.

Åñëè äëÿ êàêîãî-òî ñîñåäíåãî óçëà âíîâü âû÷èñëåííàÿ äëèíà ïóòè îêàçûâàåòñÿ ìåíüøå, ÷åì èçâåñòíàÿ ðàíåå (òî åñòü õðàíÿùàÿñÿ â óçëå), òî ìåíÿåì çíà÷åíèå dist äëÿ ýòîãî ñîñåäíåãî óçëà. Åñëè ñîñåäíåãî óçëà åùå íåò â êó÷å, òî äîáàâëÿåì åãî òóäà. Åñëè æå îí óæå ñîäåðæèòñÿ â êó÷å, òî ïåðåôîðìèðóåì êó÷ó èç-çà èçìåíåíèÿ çíà÷åíèÿ â óçëå.



Ïðîöåäóðà Äåéêñòðà<âõ: graph: ãðàô, source: èñõîäíûé óçåë>

dist[source] := 0

äâîè÷íàÿ_êó÷à.ñäåëàòü ïóñòîé

Öèêë äëÿ êàæäîé âåðøèíû v ãðàôà graph âûïîëíÿòü

Åñëè v íå ðàâíà source òî

dist[v] := INFINITY

ïðåäûäóùàÿ[v] := UNDEFINED

Êîíåö åñëè

Êîíåö öèêëà

äâîè÷íàÿ_êó÷à.äîáàâèòü<âõ: source, 0>

Öèêë ïîêà äâîè÷íàÿ_êó÷à.íå ïóñòà âûïîëíÿòü

äâîè÷íàÿ_êó÷à.èçâëå÷ü ìèíèìàëüíûé<âûõ: u>

Öèêë äëÿ êàæäîãî ñîñåäà v âåðøèíû u âûïîëíÿòü

alt := dist[u] + length(u, v)

Åñëè alt < dist[v] òî

dist[v] := alt

ïðåäûäóùèé[v] := u

Åñëè äâîè÷íàÿ_êó÷à.ñîäåðæèò<âõ: v> òî

äâîè÷íàÿ_êó÷à.óìåíüøèòü ïðèîðèòåò(v, alt)

针֌

äâîè÷íàÿ_êó÷à.äîáàâèòü<âõ: v>

Êîíåö åñëè

Êîíåö åñëè

Êîíåö öèêëà

Êîíåö öèêëà

Êîíåö ïðîöåäóðû