АСП2/К2 2018
1. zadatak
Postavka
U 2-3-4 stablo sa slike ubaciti ključeve 17 i 25 i prikazati ekvivalentno crveno-crno stablo.
[ |23|45] / | \ [ 1|15|20] [28|36| ] [ |72| ]
Rešenje
Ključ 17 dolazi između ključeva 15 i 20. Pošto je taj čvor pun, crni ključ 15 ide u roditeljski čvor, ključ 1 dolazi u sredinu i postaje crn, ključ 20 se odvaja u desni čvor i postaje crn a ključ 17 završava kao crveni ključ levo od ključa 20.
[15|23|45] / | \ [ | 1| ] [17|20| ] [28|36| ] [ |72| ]
Ključ 25 dolazi levo od ključa 28.
[15|23|45] / | | \ [ | 1| ] [17|20| ] [25|28|36] [ |72| ]
2. zadatak
Postavka
B+-stabla
- Prikazati maksimalno popunjeno B+-stablo reda m = 3 i visine h = 1. Odrediti za ovo stablo prosečan broj pristupa prilikom uspešne i neuspešne pretrage.
- Posmatra se B+-stablo reda 4 koje sadrži 7 ključeva. Odrediti za ovo stablo srednji broj pristupa prilikom uspešne i neuspešne pretrage i obrazložiti odgovor.
Rešenje
(2|4) / | \ [1|2]->[3|4]->[5|6]
2 je prosečan broj pristupa i pri uspešnoj i pri neuspešnoj pretrazi.
(3|5| ) / | \ [1|2|3]->[4|5| ]->[6|7| ]
Pretpostavljajući da se ovde radi o broju ključeva u listovima (pošto se ključevi iz unutrašnjih čvorova dupliciraju u listovima), prosečan broj pristupa je ponovo 2. Sve uspešne pretrage, kao i neuspešne, moraju završiti u listovima jer se samo u listovima nalaze pokazivači ka traženim strukturama, a visina ovako napravljenog stabla je 1.
3. zadatak
Postavka
Posmatra se trie stablo čiji su ključevi znakovni nizovi koji sadrže cifre u brojnom sistemu sa osnovom 10. Napisati u pseudokodu funkciju koja za dato stablo na čiji koren pokazuje pokazivač root računa razliku najvećeg i najmanjeg tako predstavljenog broja.
Rešenje
CALC(root)
if root = nil then
return 0
end_if
min, max = CALC_R(root)
return max - min
CALC R(root)
min = +∞
max = -∞
for i = 0 to 9 do
field = fields(root)[i]
if field ≠ nil then
if is_leaf(field) then
f_max = f_min = value(field)
else
f_max, f_min = CALC_R(field)
end_if
if f_max > max then
max = f_max
end_if
if f_min < min then
min = f_min
end_if
end_if
end_for
return max, min
4. zadatak
Postavka
Posmatra se B stablo reda m u kojem su svi listovi minimalno popunjeni, a njihovi roditelji su popunjeni iznad minimuma. Iz takvog stabla se briše ključ key iz lista sa adresom node. Napisati iterativnu funkciju u pseudokodu za datu situaciju brisanja. Smatrati da u čvoru postoji pokazivač na roditelja i podatak o broju ključeva smeštenih u njemu.
Rešenje
B-DELETE-NO-BORROW(root, m, node, key)
child_index = 0
parent = parent(node)
for i = 0 to num(parent) do
if pointers(parent)[i] = node then
child_index = i
break
end_if
end_for
if child_index = num(parent) then
left_node = pointers(parent)[child_index-1]
num(left_node) = num(left_node) + 1
keys(left_node)[num(left_node)] = keys(parent)[child_index]
for i = 1 to num(node) do
if keys(node)[i] ≠ key then
num(left_node) = num(left_node) + 1
keys(left_node)[num(left_node)] = keys(node)[i]
end_if
end_for
FREENODE(node)
else
right_node = pointers(parent)[child_index+1]
offset = 0
for i = 1 to num(node) do
if keys(node)[i] = key then
offset = 1
else
keys(node)[i-offset] = keys(node)[i]
end_if
end_for
keys(node)[num(node)] = keys(parent)[child_index+1]
for i = 1 to num(right_node) do
num(node) = num(node) + 1
keys(node)[num(node)] = keys(right_node)[i]
end_for
for i = child_index to num(parent)-1 do
keys(parent)[i+1] = keys(parent)[i+2]
pointers(parent)[i] = pointers(parent)[i+1]
end_for
FREENODE(right_node)
end_if
num(parent) = num(parent) - 1
5. zadatak
Postavka
U B* stablo reda 4 se umeću ključevi od 1 do 14. Nakon toga se redom brišu ključevi 4, 11 i 9. Nacrtati izgled stabla nakon svake izmene.
Rešenje
- Red stabla:
- Minimalni broj ključeva u ne-korenskom čvoru:
- Maksimalni broj ključeva u korenu:
- Raspodela ključeva pri prelomu: 2-2-2
Umećemo ključ 1 u prazno stablo.
[ 1| | | ]
Umećemo ključ 2.
[ 1| 2| | ]
Umećemo ključ 3.
[ 1| 2| 3| ]
Umećemo ključ 4.
[ 1| 2| 3| 4]
Pri umetanju ključa 5 dolazi do prelamanja čvora, tako da ključevi 1 i 2 idu u levi a 4 i 5 u desni čvor.
[ 3| | | ] | | [ 1| 2| ] [ 4| 5| ]
Umećemo ključ 6.
[ 3| | | ] | | [ 1| 2| ] [ 4| 5| 6]
Pri umetanju ključa 7 desni čvor se prepunjuje, pa se dešava prelivanje u levi čvor. Ključ 3 iz roditeljskog čvora silazi u levi a ključ 4 iz desnog ide u roditeljski.
[ 4| | | ] | | [ 1| 2| 3] [ 5| 6| 7]
Pri umetanju ključa 8 desni čvor se ponovo prepunjuje, pa se dešava prelamanje. Ključevi 1 i 2 ostaju u levom čvoru, ključ 3 ide u roditeljski čvor, 4 i 5 dolaze u novi, srednji čvor, 6 ide u roditeljski čvor a 7 i 8 ostaju u desnom čvoru.
[ 3| 6| | ] / | \ [ 1| 2| ] [ 4| 5| ] [ 7| 8| ]
Umećemo ključ 9.
[ 3| 6| | ] / | \ [ 1| 2| ] [ 4| 5| ] [ 7| 8| 9]
Pri umetanju ključa 10 dešava se prelivanje iz desnog u srednji čvor.
[ 3| 7| | ] / | \ [ 1| 2| ] [ 4| 5| 6] [ 8| 9|10]
Pri umetanju ključa 11 dešava se prelamanje.
[ 3| 6| 9| ] / | \ \ [ 1| 2| ] [ 4| 5| ] [ 7| 8| ] [10|11| ]
Umećemo ključ 12.
[ 3| 6| 9| ] / | \ \ [ 1| 2| ] [ 4| 5| ] [ 7| 8| ] [10|11|12]
Pri umetanju ključa 13 dešava se prelivanje.
[ 3| 6|10| ] / | \ \ [ 1| 2| ] [ 4| 5| ] [ 7| 8| 9] [11|12|13]
Pri umetanju ključa 14 dešava se prelamanje.
[ 3| 6| 9|12] / / | \ \ [ 1| 2| ] [ 4| 5| ] [ 7| 8| ] [10|11| ] [13|14| ]
Pri brisanju ključa 4, zbog nemogućnosti pozajmice, spajanje tri čvora u dva.
[ 5| 9| 12 |] / / | \ [ 1| 2| 3 ] [ 6| 7| 8 ] [ 10|11| ] [13|14| ]
Pri brisanju ključa 11 moguća je pozajmica, ali od levog brata.
[ 5| 8| 12 |] / / | \ [ 1| 2| 3 ] [ 6| 7|] [ 9 |10| ] [13|14| ]
Pri brisanju ključa 9 moguća je pozajmica ali od brata sa udaljenošću dva.
[ 3| 7| 12 |] / / | \ [ 1| 2| ] [ 5| 6| ] [ 8 |10| ] [13|14| ]
6. zadatak
Postavka
Dato je digitalno stablo formirano od nekog skupa ključeva tipa znakovnih nizova. Implementirati funkciju COUNT_KEYS koja pronalazi broj ključeva u stablu koji odgovaraju zadatom formatu znakovnog niza. Pokazivač na koren stabla i zadati format su prosleđeni kao parametri funkcije. Format znakovnog niza pored cifara i slova može sadržati i simbole koji imaju specijano značenje. Specijalni simboli su tačka (.) koja menja bilo koji znak niza i zvezda (*) koja predstavlja ponavljanje nekog znaka niza 0 ili više puta. Smatrati da se zvezda odnosi na prvi znak koji joj prethodi.
Primer:
skup ključeva u stablu: abccc4a, ab3a, aacda
format: abc*.a
rezultat: 2
Rešenje
COUNT KEYS(root, format)
len = STRING_LENGTH(format)
if len = 0 then
if key(node) = EOK then
return 1
else
return 0
end_if
end_if
count = 0
for i = 1 to num(root) do
node = pointers(root)[i]
if (len > 1) and (format[2] = '*') then
if (key(node) = format[1]) or (format[1] = '.') then
count = count + COUNT_KEYS(node, format)
end_if
else if (key(node) = format[1]) or (format[1] = '.') then
count = count + COUNT_KEYS(node, format + 1)
end_if
end_for
if (len > 1) and (format[2] = '*') then
count = count + COUNT_KEYS(root, format + 2)
end_if
return count
7. zadatak
Postavka
Neka se u top-down stablo m-arnog pretraživanja redom ubacuju ključevi k, 2k, 3k, …, nk, nk – 1, nk – 2, nk – 3, …, n(k – 1) +1. Nacrtati izgled stabla i odrediti visinu. Pretpostaviti da su n i k mnogo veći od m.
Rešenje
Nakon ubacivanja ključa nk dobiće se degenerisano stablo udesno, tj. jedino najdesniji pokazivači u svakom unutrašnjem čvoru će pokazivati na sledeći list, i većina ključeva će biti popunjena, tako da će visina stabla biti a u listu će ostati slobodnih mesta. Nakon ubacivanja svih ključeva stablo će u listovima krenuti da raste ulevo iz listova, tako da će visina porasti na ukupno: .
8. zadatak
Postavka
Heširanje.
- Šta je minimalna savršena heš funkcija?
- Za ključeve 54, 91, 57, 23 i 28 naći što jednostavniju minimalnu savršenu heš funkciju i ispisati je. Obrazložiti odgovor i nacrtati heš tabelu sa umetnutim ključevima.
Rešenje
- Minimalna savršena heš funkcija je heš funkcija koja preslikava n ključeva u n ulaza tabele bez kolizije.
- Jedna moguća savršena heš funkcija je . Kad sortiramo ključeve, dobijamo redosled 23, 28, 54, 57. Možemo primetiti da su oni svi različiti po modulu 10, ali pošto tabela ima 5 ulaza možemo prvo podeliti ključeve sa dva pa uzeti vrednost po modulu 5. Tabela nakon primene ove heš funkcije je data ispod.
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
91 | 23 | 54 | 57 | 28 |