Äâîè÷íàÿ êó÷à (ïèðàìèäà, ñîðòèðóþùåå äåðåâî) — ýòî äâîè÷íîå äåðåâî, óäîâëåòâîðÿþùåå ñëåäóþùèì óñëîâèÿì:
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)
Êîíåö öèêëà
Êîíåö ïðîöåäóðû
Äâîè÷íàÿ êó÷à ìîæåò áûòü èñïîëüçîâàíà äëÿ ñîðòèðîâêè ìàññèâà áåç èñïîëüçîâàíèÿ äîïîëíèòåëüíîãî ìåñòà (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); ! Ïðîñåÿòü: ïåðåìåñòèòü ñîäåðæèìîå êîðíÿ âíèç,
! ïîêà äåðåâî ñíîâà íå ñòàíåò äâîè÷íîé êó÷åé
Êîíåö öèêëà
Êîíåö ïðîöåäóðû
Î÷åðåäü — FIFO (ñòåê - LIFO)
Î÷åðåäü ñ ïðèîðèòåòàìè — ýòî ñòðóêòóðà äàííûõ î÷åðåäü, ýëåìåíòû êîòîðîé óïîðÿäî÷åíû ïî ïðèîðèòåòó.
Ïðè äîáàâëåíèè ýëåìåíòà îí äîáàâëÿåòñÿ â î÷åðåäü ïåðåä òåìè ýëåìåíòàìè, ó êîòîðûõ ïðèîðèòåò íèæå, ÷åì ó íåãî.
Î÷åðåäü ñ ïðèîðèòåòàìè óäîáíî ðåàëèçîâûâàòü íà îñíîâå äâîè÷íîé êó÷è. Ãîëîâîé î÷åðåäü áóäåò êîðåíü äâîè÷íîãî äåðåâà. Ïðè óäàëåíèè ýëåìåíòà (êîðíÿ) èç î÷åðåäè ñ ïðèîðèòåòàìè äâîè÷íàÿ êó÷à ïåðåñòðàèâàåòñÿ äëÿ ñîõðàíåíèÿ ñâîåãî ñâîéñòâà (çíà÷åíèå â óçëå áîëüøå, ÷åì çíà÷åíèÿ âî âñåõ åãî ïîòîìêàõ).
Ãðàô — ýòî ñòðóêòóðà äàííûõ, ñîñòîÿùàÿ èç íàáîðà âåðøèí è íàáîðà ðåáåð, êîòîðûå ìîãóò ñâÿçûâàòü ïàðó âåðøèí.
Ðåáðà ìîãóò áûòü îäíîíàïðàâëåííûå èëè äâóíàïðàâëåííûå.
Ðåáðà ìîãóò èìåòü âåñ (íàãðóçêó), êîòîðûé èíîãäà íàçûâàåòñÿ äëèíîé ðåáðà.  ýòîì ñëó÷àå ãðàô íàçûâàåòñÿ íàãðóæåííûì.
Àëãîðèòì Äåéêñòðû íàõîäèò êðàò÷àéøèé ïóòü ìåæäó äâóìÿ âåðøèíàìè â íàãðóæåííîì ãðàôå ñ ïîëîæèòåëüíûìè äëèíàìè ðåáåð.
Ïðèìåð èñïîëüçîâàíèÿ
Çàäà÷à 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>
Êîíåö åñëè
Êîíåö åñëè
Êîíåö öèêëà
Êîíåö öèêëà
Êîíåö ïðîöåäóðû