ALGORYTMY I STRUKTURY DANYCH
WYKAD V (materiaªy pomocnicze)
Struktury danych,
kolejka priorytetowa, struktura Find-Union
Polsko Japo«ska Wy»sza Szkoªa Technik Komputerowych
Plan wykªadu:
•
kolejka priorytetowa:kopiec binarny - drzewo,
kopiec binarny - tablica,
kopiec binarny - efektywna budowa,
kopiec binarny - algorytm sortowania,
kopiec lewicowy,
•
struktura Find-Union:listy z balansowaniem,
drzewa
n
-arne z balansowaniem i kompresj¡ ±cie»ek.Kolejka priorytetowa
Kolejka priorytetowa
Idea (model standardowy kolejki priorytetowej):
• hE ∪ P Q ∪ {true, f alse} , empty, member, min, insert, delmini, gdzie P Q
jest uniwersum
multizbiorów,
• empty (pq) ≡ df (pq = ∅),
• member (pq, e) ≡ df (e ∈ pq),
• min (pq) = df (min ({e : e ∈ pq})) ,
• insert (pq, e) = df (pq ∪ {e}),
• delmin (pq, e) = df (pq \ min ({e : e ∈ pq})).
Specykacja kolejki priorytetowej:
•
sygnatura:hE ∪ P Q, empty, member, min, insert, delmini
Kolejka priorytetowa
Specykacja kolejki(c.d.):
•
sygnatura:
min : P Q → E
,
insert : P Q × E → P Q
,
delmin : P Q → P Q
,•
aksjomaty:
hE, ≤i
jest zbiorem liniowo uporz¡dkowanym,
member (pq, e) ≡ P (pq, e)
, gdzie P jest nast¦puj¡cym programem while (!empty(pq)) {if (min(pq)==e) return true; else pq=delmin(pq);
}
Kolejka priorytetowa
Specykacja kolejki(c.d.):
•
aksjomaty:
¬empty (pq) ⇒ (∀e ∈ E (member (pq, e) ⇒ min (pq) ≤ e))
,
member (insert (pq, e) , e)
,e 6= e 0 ⇒ member (pq, e) ≡ member (insert (pq, e 0 ) , e) ,
member (min (pq) , pq)
,e 6= min (pq) ⇒ member (pq, e) ≡ member (delmin (pq) , e) ,
program while (!empty(pq)) pq=delmin(pq); ma wªasno±¢ stopu.
Twierdzenie. Dowolna struktura, która speªnia aksjomaty specykacji kolejki priorytetowej jest
izomorczna z pewn¡ standardow¡ struktur¡ kolejek priorytetowych.
Pytanie. Jaka jest zªo»ono±¢ ±rednia i pesymistyczna operacji kolejki priorytetowej
min
,insert
Kolejka priorytetowa
(kopiec binarny drzewo)
Kolejka priorytetowa kopiec binarny - drzewo
Denicja. Kopcem binarnym (typu min) nazywamy drzewo binarne
G = (V G , E G , et)
, gdzie:• et : V G → E jest funkcj¡ etykietowania wierzchoªków i E
jest pewnym niepustym, liniowo
uporz¡dkowanym zbiorem etykiet
hE, ≤i
,•
dla ka»dej trójki wierzchoªkówu, v, w
, je»eli:
v
jest lewym nast¦pnikiem wierzchoªkau
, toet (u) ≤ et (v)
,
w
jest prawym nast¦pnikiem wierzchoªkau
, toet (u) ≤ et (w)
,Kolejka priorytetowa kopiec binarny - drzewo
Denicja (c.d.).
•
drzewo jest drzewem doskonaªym, z ewentualnym wyj¡tkiem ostatniego poziomu, na którym wszystkie li±cie s¡ zgrupowane skrajnie na lewo (tzw. lewostronne wypeªnienie)Uwaga! Analogiczn¡ denicj¦ mo»na wprowadzi¢ dla kopców typu max. W dalszej cz¦±ci tego
wykªadu kopcem b¦dziemy domy±lnie nazywali kopiec typu min.
Pytanie. Czy kopiec jest drzewem zrównowa»onym w sensie zrównowa»enia struktury AVL?
Kolejka priorytetowa kopiec binarny - drzewo
Przykªady:
•
zbiór etykiethN, ≤i
:•
zbiór etykiethΠ, ≤ leks i
, gdzieΠ
jest zbiorem sªów j¦zyka polskiego:Kolejka priorytetowa kopiec binarny - drzewo
Szczegóªy implementacji.
Kolejka priorytetowa kopiec binarny - drzewo
Operacji
insert (pq, e)
idea. NiechH
b¦dzie kopcem-drzewem, b¦d¡cym implementacj¡kolejki priorytetowej
pq
dla uniwersum elementówE
, i nieche
b¦dzie elementem uniwersumE
,wtedy:
•
utwórz nowy wierzchoªek z etykiet¡e
na ostatnim poziomie drzewa i na pierwszej wolnejskrajnie lewej pozycji (odpowiednio dowi¡zania
f ree.lef t
albof ree.right
),•
rozpoczynaj¡c od nowo utworzonego wierzchoªkav
:je»eli
et (v) < et (v.parent)
, zamie« etykiety wierzchoªkówv
orazv.parent
, przejd¹ dowierzchoªka
v.parent
i powtórz post¦powanie, w p.p. zako«cz dziaªanie algorytmu.Przykªad. Wstawiamy do kolejki priorytetowej
pq = {1, 2, 3, 3, 6, 8}
element2
.Kolejka priorytetowa kopiec binarny - drzewo
Operacja
delmin (pq)
idea. NiechH
b¦dzie kopcem-drzewem, b¦d¡cym implementacj¡ kolejki priorytetowejpq
dla uniwersum elementówE
, wtedy:•
zamie« etykiety wierzchoªka korzenia oraz wierzchoªkav
znajduj¡cego si¦ na ostatnim poziomie drzewa i na ostatniej zaj¦tej skrajnie prawej pozycji (dowi¡zanielast
),•
usu« wierzchoªekv
,•
rozpoczynaj¡c od korzenia kopca (je»eliempty (pq) = f alse
):niech
v
b¦dzie aktualnie rozwa»anym wierzchoªkiem, wtedy je»eliet (v) > min ({et (v.lef t) , et (v.right)}) ,
to zamie« etykiet¦ wierzchoªka
v
z mniejsz¡ z etykiet wierzchoªków nast¦pników wierzchoªkav
, niech b¦dzie toet (u)
, przejd¹ do wierzchoªkau
i powtórz powy»szepost¦powanie, w p.p. zako«cz dziaªanie algorytmu.
Kolejka priorytetowa kopiec binarny - drzewo
Przykªad. Usuwamy wierzchoªek minimalny z kolejki priorytetowej
pq = {1, 2, 3, 3, 6, 8}
.Pytanie. Jaka jest zªo»ono±¢ ±rednia i pesymistyczna operacji kolejki priorytetowej
min
,insert
oraz
delmin
w przypadku implementacji struktury w kopcu-drzewie?Pytanie. Jaka jest zªo»ono±¢ ±rednia i pesymistyczna operacji
member
w przypadkuimplementacji struktury w kopcu-drzewie?
Kolejka priorytetowa
(kopiec binarny tablica)
Kolejka priorytetowa kopiec binarny - tablica
Pytanie. Czy kopiec binarny mo»na efektywnie zaimplementowa¢ w tablicy statycznej?
Odpowied¹. Tak, przy zaªo»eniu, »e z góry znamy maksymaln¡ liczb¦
n
elementówprzechowywanych w strukturze kopca. Wtedy dla ka»dego wierzchoªka kopca-drzewa
v
, je»eliindeks elementu
v
w tablicy statycznejT
równy jesti
, to (dla uªatwienia przyjmujemy, »e tablicaT
indeksowana jest pocz¡wszy od warto±ci1
don
):•
nast¦pnik lewy oraz prawy wierzchoªkav
, o ile istniej¡, to elementy tablicyT [2 · i]
orazT [2 · i + 1]
,•
poprzednik wierzchoªkav
, o ile istnieje, to elementT i
2
.
Przykªad. Kolejka priorytetowa
pq = {B, C, D, H, G, S}
i jej równowa»ne implementacje, kopiec-drzewo i kopiec-tablica.Operacja
insert (pq, e)
idea. NiechT
b¦dzie kopcem-tablic¡, b¦d¡c¡ implementacj¡ kolejki priorytetowejpq
dla uniwersum elementówE
, i nieche
b¦dzie elementem uniwersumE
, wtedy:•
wstaw elemente
na pierwsz¡ woln¡ pozycj¦ w tablicyT
, niech b¦dzie to pozycjai
-ta,•
rozpoczynaj¡c rozpoczynaj¡c od elementuT [i]
:je»eli
T [i] < T i
2
, zamie« elementy
T [i]
orazT i
2
, podstaw
i = i
2
i powtórz
post¦powanie, w p.p. zako«cz dziaªanie algorytmu.
Przykªad. Wstawiamy do kolejki priorytetowej
pq = {B, C, D, H, G, S}
elementA
.Kolejka priorytetowa kopiec binarny - tablica
Operacja
delmin (pq)
idea. NiechH
b¦dzie kopcem-tablic¡, b¦d¡c¡ implementacj¡ kolejki priorytetowejpq
dla uniwersum elementówE
, wtedy:•
podstawT [1] = T [i]
, gdziei
jest indeksem ostatniej zaj¦tej pozycji w tablicyT
,•
usu« elementi
-ty tablicyT
,•
rozpoczynaj¡c od elementuT [1]
(je»eliempty (pq) = f alse
):niech
j
b¦dzie indeksem aktualnie rozwa»anego elementu w tablicyT
, wtedy je»eliT [j] > min ({T [2 · j] , T [2 · j + 1]}) ,
to zamie«
T [j]
z mniejszym z elementówT [2 · j] , T [2 · j + 1]
, niech b¦dzie toT [k]
,podstaw
j = k
i powtórz powy»sze post¦powanie, w p.p. zako«cz dziaªanie algorytmu.Kolejka priorytetowa kopiec binarny - tablica
Przykªad. Usuwamy wierzchoªek minimalny z kolejki priorytetowej
pq = {B, C, D, H, G, S}
.Pytanie. Jaka jest zªo»ono±¢ ±rednia i pesymistyczna operacji kolejki priorytetowej
delmin
wprzypadku implementacji struktury w kopcu-tablicy?
Pytanie. Jaka jest zªo»ono±¢ ±rednia i pesymistyczna operacji
min
orazmember
w przypadkuimplementacji struktury w kopcu-tablicy?
Pytanie. Jak efektywnie wyznaczy¢ pierwsz¡ woln¡/ostatni¡ zaj¦t¡ pozycj¦ w kopcu-tablicy
T
?insert delete
Kolejka priorytetowa
(kopiec binarny efektywna budowa)
Kolejka priorytetowa kopiec binarny - efektywna budowa
Idea algorytmu HeapConstruct. Niech
e 1 , e 2 , . . . , e n
b¦dzie ci¡giemn
elementów pewnegozbioru
E
z wyró»nion¡ relacj¡ porz¡dku liniowego≤
:•
zapisz elementy ci¡gu w tablicyT
(dla uªatwienia przyjmujemy, »e tablicaT
indeksowana jest pocz¡wszy od warto±ci1
don
),•
dlai = n 2 , n 2 − 1, . . . , 1
wykonaj (*):niech
j
b¦dzie indeksem aktualnie rozwa»anego elementu w tablicyT
, wtedy je»eliT [j] > min ({T [2 · j] , T [2 · j + 1]}) ,
to zamie«
T [j]
z mniejszym z elementówT [2 · j] , T [2 · j + 1]
, niech b¦dzie toT [k]
,podstaw
j = k
i powtórz powy»sze post¦powanie, w p.p. przerwij dziaªanie i powró¢ do (*).Kolejka priorytetowa kopiec binarny - efektywna budowa
Zadanie. Przedstaw krok po kroku dziaªanie algorytmu HeapConstruct dla ci¡gu liczb
4,5,2,8,9,4,1,7,6.
Fakt. Pesymistyczn¡ zªo»ono±¢ czasow¡ algorytmu HeapConstruct mo»na ograniczy¢ przez
W (n) ≤
blg nc
X
h=0
l n 2 h+1
m · O (h) ,
gdzie
l n 2
h+1m
jest górnym ograniczeniem liczby w¦zªów b¦d¡cych korzeniami poddrzew wysoko±ci
h
w kopcun
-elementowym, st¡dW (n) ≤ n
blg nc
X
h=0
O (h) 2 h+1
= O
n
blg nc
X
h=0
h 2 h
i poniewa»
blg nc
X
h=0
h 2 h ≤
X ∞ h=0
h
2 h = 2
, toW (n) = O (n)
.Kolejka priorytetowa
(kopiec binarny sortowanie)
Kolejka priorytetowa kopiec binarny - algorytm sortowania
Idea algorytmu HeapSort. Niech
e 1 , e 2 , . . . , e n
b¦dzie ci¡giemn
elementów pewnego zbioruE
z wyró»nion¡ relacj¡ porz¡dku liniowego
≤
, wtedy:•
zbuduj kopiec prze kolejne wstawienie elementów rozwa»anego ci¡gu do pocz¡tkowo pustej struktury albo stosuj¡c algorytm HeapConstruct,•
wykonajn
razy operacj¦min
orazdelmin
.Rezultatem dziaªania algorytmu jest uporz¡dkowana niemalej¡co permutacja elementów ci¡gu
e 1 , e 2 , . . . , e n
.Zadanie. Przedstaw krok po kroku dziaªanie algorytmu HeapSort dla ci¡gu liczb
4,5,2,8,9,4,1,7,6.
Pytanie. Jaka jest ±rednia i pesymistyczna zªo»ono±¢ czasowa algorytmu HeapSort?
Kolejka priorytetowa
(kopiec lewicowy)
Kolejka priorytetowa kopiec lewicowy
Denicja. Kopcem lewicowym nazywamy drzewo binarne
G = (V G , E G , et)
, gdzie:• et : V G → E jest funkcj¡ etykietowania wierzchoªków i E
jest pewnym niepustym, liniowo
uporz¡dkowanym zbiorem etykiet
hE, ≤i
,•
etykiety wierzchoªków uªo»one s¡ zgodnie z porz¡dkiem kopcowym (typu min albo max),•
dla ka»dej trójki wierzchoªkówu, v, w
, gdzie wierzchoªkiu, w
s¡ ustalone oraz wierzchoªekw
nie posiadaj¡ prawego nast¦pnika a wierzchoªek
v
nie posiada lewego lub prawegonast¦pnika, ró»nica dªugo±ci ±cie»ek z wierzchoªka
u
do wierzchoªkav
oraz z wierzchoªkau
do wierzchoªka
w
(tzw. skrajnie prawa ±cie»ka , inaczejsps (u) = d (u, w)
), jest liczb¡nieujemn¡ (tj.
sps (u) ≤ d (u, v)
).Przykªady:
•
drzewa binarne b¦d¡ce kopcami lewicowymi, zbiór etykiethN, ≤i
:•
drzewa binarne nie b¦d¡ce kopcami lewicowymi, zbiór etykiethΠ, ≤ leks i
:Kolejka priorytetowa kopiec lewicowy
Lemat. Niech
H
b¦dzie kopcem lewicowym skªadaj¡cym si¦ zn
wierzchoªków. Dªugo±¢ skrajnie prawej ±cie»ki w kopcuH
jest nie wi¦ksza ni»blg nc
.Dowód. Zaªó»my, »e
H
jestn
-elementowym kopcem lewicowym, w którym skrajnie prawa±cie»ka jest dªugo±ci
d
wi¦kszej ni»blg nc
. Poniewa» kopiecH
jest drzewem lewicowym, to dopoziomu
d
wª¡cznie jest tak»e drzewem doskonaªym (w p.p. istniaªaby ±cie»kakorze«-wierzchoªek nie posiadaj¡cy lewego lub prawego nast¦pnika o dªugo±ci mniejszej ni»
d
,czyli kopiec
H
nie byªby drzewem lewicowym). St¡d kopiecH
zbudowany jest z co najmniej2 d+1 − 1
wierzchoªków. Poniewa» z zaªo»eniad > blg nc
, to2 d+1 − 1 > 2 blg nc+1 − 1 ≥ 2 lg n
,czyli liczba wierzchoªków w kopcu
H
jest wi¦ksza ni»2 lg n = n
sprzeczno±¢.Ostatecznie w ka»dym
n
-elementowym kopcu lewicowym dªugo±¢ skrajnie prawej ±cie»ki jest mniejsza albo równablg nc
.Kolejka priorytetowa kopiec lewicowy
Operacja
merge (v 1 , v 2 )
idea. Niechv 1
orazv 2
b¦d¡ dowi¡zaniami do korzeni kopców lewicowych odpowiednioH 1
orazH 2
. Wykonaj kolejno:•
je»eli drzewoH 1
alboH 2
jest drzewem pustym, to:je»eli drzewo
H 1
jest drzewem pustym, to rezultatem scalania jest drzewoH 2
, w.p.p.rezultatem scalania jest drzewo
H 1
,•
w p.p.:je»eli
et (v 1 ) > et (v 2 )
, to zamie« miejscami poddrzewa o korzeniachv 1
orazv 2
,wykonaj rekurencyjnie scalanie
v 1 .right = merge(v 1 .right, v 2 )
,je»eli
d (sps (v 1 .lef t )) < d (sps (v 1 .right ))
, to zamie« miejscami poddrzewa okorzeniach
v 1 .lef t
orazv 1 .right
,rezultatem scalania jest drzewo o korzeniu w wierzchoªku
v 1
.Kolejka priorytetowa kopiec lewicowy
Przykªad. Scalanie dwóch kopców lewicowych z u»yciem metody
merge
. Kolorem czerwonymzaznaczono wierzchoªki b¦d¡ce argumentami porównania
et (v 1 ) > et (v 2 )
, kolorem zielonymwªa±ciwe scalanie a kolorem niebieskim wierzchoªek korze« b¦d¡cy argumentem porównania
d (sps (v 1 .lef t)) < d (sps (v 1 .right))
.Kolejka priorytetowa kopiec lewicowy
Wniosek. Je»eli
v 1
orazv 2
s¡ dowi¡zaniami do korzeni kopców lewicowych, to rezultat operacjimerge(v 1 .right, v 2 )
jest tak»e kopcem lewicowym.Wniosek. Niech
v 1
orazv 2
b¦d¡ dowi¡zaniami do korzeni kopców lewicowych odpowiednion
im
wierzchoªkowego, wtedyW (merge(v 1 .right, v 2 ), n, m) = O (lg (max (n, m))) .
.Prytanie. Jaka jest zªo»ono±¢ pami¦ciowa operacji
merge
?Kolejka priorytetowa kopiec lewicowy
Operacja
insert (pq, e)
idea. NiechH 1
b¦dzie kopcem lewicowym z wierzchoªkiem korzeniemv 1
, b¦d¡cym implementacj¡ kolejki priorytetowejpq
dla uniwersum elementówE
, i nieche
b¦dzieelementem uniwersum
E
, wtedy:•
utwórz nowy1
-wierzchoªkowy kopiec lewicowyH 2
o korzeniuv 2
z etykiet¡e
,•
wykonajv 1 = merge (v 1 , v 2 )
.Operacja
delmin (pq)
idea. NiechH
b¦dzie kopcem lewicowym z wierzchoªkiem korzeniemv
,b¦d¡cym implementacj¡ kolejki priorytetowej
pq
dla uniwersum elementówE
, wtedy:•
usu« wierzchoªekv
,•
wykonajv = merge (v.lef t, v.right)
.Struktura Find-Union
Struktura Find-Union
Przypomnienie. Niech
E = {e 1 , e 2 , . . . , e n }
b¦dzie zbiorem, podziaªem zbioruE
nazywamyrodzin¦ zbiorów
U = {S 1 , S 2 , . . . , S k }
tak¡, »e:• S i 6= ∅, dla ka»dego 1 ≤ i ≤ k
,
• S i ∩ S j = ∅, dla ka»dego 1 ≤ i < j ≤ k
,
•
[ k i=1
S i = E
.Idea struktury Find-Union: niech
U = {S 1 , S 2 , . . . , S k }
b¦dzie podziaªem zbioruE = {e 1 , e 2 , . . . , e n }
aU
zbiorem wszystkich mo»liwych podziaªów zboruE
, wtedy• hE ∪ U, init, f ind, unioni,
• init (E) = df (U ) taki, »e dla ka»dego 1 ≤ i ≤ k
zachodzi |S i | = 1
,
Struktura Find-Union
(listy z balansowaniem)
Struktura Find-Union listy z balansowaniem
Reprezentacja zbioru
S i
:gdzie:
• e 1 reprezentant zbioru S i
,
= |S |
Struktura Find-Union listy z balansowaniem
Szkic realizacji operacji:
• init (E) utworzenie n
jednoelementowych list,
• f ind (U, e) odczytanie etykiety elementu e.head
,
• union (U, S i , S j ) przyª¡czenie listy krótszej na koniec dªu»szej (tzw. balansowanie), dla ka»dego elementu listy krótszej zmiana dowi¡za« do reprezentanta zbioru.
Zadanie. Przedstaw krok po kroku stan struktury Find-Union
U
dla zbioruE = {1, 2, 3, 4, 5, 6}
ici¡gu operacji:
init (E) ; union (U, f ind (U, 1) , f ind (U, 2)) ; union (U, f ind (U, 5) , f ind (U, 6)) ; union (U, f ind (U, 2) , f ind (U, 6)) ; union (U, f ind (U, 3) , f ind (U, 6)) .
Twierdzenie. Koszt ci¡gu operacji
init
, oraz przemieszanychm
operacjif ind
orazn
operacjiunion
dla implementacji struktury Find-Union w postaci zbioru list z balansowaniem jest rz¦duStruktura Find-Union
(drzewa
n
-arne z balansowaniem i kompresj¡ ±cie»ek)Struktura Find-Union drzewa
n
-arne z balansowaniem i kompresj¡ ±cie»ekReprezentacja zbioru
S i
:gdzie:
• e 1 reprezentant zbioru S i
,
Struktura Find-Union drzewa
n
-arne z balansowaniem i kompresj¡ ±cie»ekSzkic realizacji operacji:
• init (E) utworzenie n
jednoelementowych drzew,
• f ind (U, e) przej±cie ±cie»ki z wierzchoªka o etykiecie e
do korzenia drzewa i odczytanie
etykiety w korzeniu drzewa, w trakcie przechodzenia dowi¡zanie atrybutu
parent
,wszystkich odwiedzonych wierzchoªków, bezpo±rednio do korzenia drzewa (tzw. kompresja
±cie»ek), np.
Szkic realizacji operacji (c.d.):
• union (U, S i , S j ) przyª¡czenie mniejszego drzewa bezpo±rednio do korzenia drzewa wi¦kszego (tzw. balansowanie).
Zadanie. Przedstaw krok po kroku stan struktury Find-Union
U
dla zbioruE = {1, 2, 3, 4, 5, 6}
ici¡gu operacji:
init (E) ; union (U, f ind (U, 1) , f ind (U, 2)) ; union (U, f ind (U, 5) , f ind (U, 6)) ; union (U, f ind (U, 2) , f ind (U, 6)) ; union (U, f ind (U, 3) , f ind (U, 6)) .
Twierdzenie. Koszt ci¡gu operacji
init
, oraz przemieszanychm
operacjif ind
orazn
operacjiunion
dla implementacji struktury Find-Union w postaci zbioru drzew z balansowaniem ikompresj¡ ±cie»ek jest rz¦du