АСП2/К3 2018
1. задатак
Поставка
Приказати изглед бинарног хипа након уклањања минималног кључа и након уметања кључева 9 и 30.
5
/ \
10 7
/ \ / \
47 32 12 31
/
54
Решење
Након уклањања минималног кључа:
7
/ \
10 12
/ \ / \
47 32 54 31
Након уметања кључева 9 и 30:
7
/ \
9 12
/ \ / \
10 32 54 31
/ \
47 30
2. задатак
Поставка
Написати итеративну имплементацију следећег алгоритма хеширања. За хеширање се користе две хеш функције, х1(К) и х2(К), док се за разрешавање колизија користи секундарна хеш функција г(к). Над кључем К који се убацује у табелу се примењују и функција х1(К) и х2(К), а као улаз се користи резултат функције за коју се добије мање колизија. У случају једнаког броја колизија, користи се функција х1(К). Потребно је реализовати операције уметања и претраге.
Решење
Приликом уметања тражимо прву позицију на којој је празно место, прво једном а затим и другом хеш функцијом. Ако се деси да се вратимо на почетну позицију, то значи да је табела пуна и кључ се не може уметнути.
INSERT(table, K)
adr1 = adr1_init = h1(K)
adr2 = adr2_init = h2(K)
repeat
if table[adr1] = empty then
table[adr1] = K
return
else
adr1 = adr1 + g(K)
end_if
if table[adr2] = empty then
table[adr2] = K
return
else
adr2 = adr2 + g(K)
end_if
until (adr1 = adr1_init) or (adr2 = adr2_init)
ERROR(Tabela je puna)Претрага је слична уметању, с тим што ако наиђемо на непразно поље прво проверавамо да ли то поље садржи тражени кључ и настављамо претрагу ако не садржи. Претрага се такође завршава ако су обе претраге дошле до празног поља.
SEARCH(table, K)
adr1 = adr1_init = h1(K)
adr2 = adr2_init = h2(K)
repeat
if table[adr1] = K then
return true
else if table[adr1] ≠ empty then
adr1 = adr1 + g(K)
end_if
if table[adr2] = K then
return true
else if table[adr2] ≠ empty then
adr2 = adr2 + g(K)
end_if
until (adr1 = adr1_init) or (adr2 = adr2_init) or ((table[adr1] = empty) and (table[adr2] = empty))
return false3. задатак
Поставка
Дата је секвенца кључева: 169, 84, 99, 6, 61, 84, 9, 96, 158, 42, 495, 46, 223. Приказати рад схелл сорт алгоритма по корацима. Навести коришћену секвенцу инкремената и образложити избор.
Решење
Инкременти су изабрани као у решењу шестог задатка са трећег колоквијума 2020. године.
| Инкремент | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Почетак | 169 | 84 | 99 | 6 | 61 | 84 | 9 | 96 | 158 | 42 | 495 | 46 | 223 |
| 7 | 96 | 84 | 42 | 6 | 46 | 84 | 9 | 169 | 158 | 99 | 495 | 61 | 223 |
| 5 | 84 | 9 | 42 | 6 | 46 | 96 | 84 | 169 | 158 | 99 | 495 | 84 | 223 |
| 3 | 6 | 9 | 42 | 61 | 46 | 96 | 84 | 169 | 84 | 99 | 495 | 158 | 223 |
| 2 | 6 | 9 | 42 | 61 | 46 | 96 | 84 | 99 | 84 | 158 | 223 | 169 | 495 |
| 1 | 6 | 9 | 42 | 46 | 61 | 84 | 96 | 84 | 99 | 158 | 169 | 223 | 495 |
| 1 | 6 | 9 | 42 | 46 | 61 | 84 | 84 | 96 | 99 | 158 | 169 | 223 | 495 |
4. задатак
Поставка
Приложени псеудокод приказује једну варијанту буббле сорт алгоритма за сортирање података. Објаснити главне недостатке приложеног алгоритма и написати у псеудокоду алтернативну имплементацију овог алгоритма која те недостатке исправља.
for i:=1 to n-1 do
for j:=n-1 downto 1 do
if arr[j]>arr[j+1] then
b:=arr[j]; arr[j]:=arr[j+1]; arr[j+1]:=b;
end_if
end_for
end_for
Решење
Код овог алгоритма јесте највећи проблем то што n-1 пута ради итерацију кроз низ, када је то потребно радити само док се не деси да није било ниједне замене у унутрашњој петљи. Други проблем јесте непотребан пролазак од краја до почетка низа, када је пролазак од почетка до краја потенцијално ефикаснији због кеш меморије. Такође, није потребно пролазити кроз сортирани део приликом замене елемената.
BUBBLE SORT REVISITED(arr, n)
i = 1
repeat
broj_zamena = 0
for i = 1 to n-i do
if arr[i] > arr[i+1] then
arr[i] ↔ arr[i+1]
broj_zamena = broj_zamena + 1
end_if
end_for
i = i + 1
until broj_zamena = 05. задатак
Поставка
Подаци се смештају у хеш табелу са 7 улаза применом хеш функције хп(К) = К мод 7. За разрешавање колизија се користи метода двоструког хеширања са секундарном хеш функцијом хс(К) = 4 + К мод 3. Одредити просечан број приступа приликом неуспешног тражења и вероватноћу попуњавања празних улаза, под претпоставком да су сви кључеви једнако вероватни.
| 0 | 14 |
|---|---|
| 1 | |
| 2 | 11 |
| 3 | 24 |
| 4 | 18 |
| 5 | |
| 6 | 13 |
Решење
| 0 | 1 | 2 |
|---|---|---|
| 0 | 0 | 0 |
| 4 | 5 | 6 |
| 1 | 3 | 5 |
| 5 | 1 | 4 |
| 2 | 6 | 3 |
| 6 | 4 | 2 |
| 3 | 2 | 1 |
- Просечан број неуспешних приступа:
- Вероватноћа попуњавања:
- 1:
- 5:
6. задатак
Поставка
Написати у псеудокоду функцију за уклањање минималног кључа у биномном хипу и његову накнадну реорганизацију. Није потребно спровести потенцијално спајање стабала након уклањања чвора са минималним кључем. Биномни хип представљен помоћу објекта класе БинХеап која садржи уланчану листу објеката БинТрее који представљају појединачна биномна стабла. Листа је уређена растуће по степену стабла. Биномно стабло се састоји од чворова представљених објектима класе БинНоде. Функција као аргумент прима објекат класе БинХеап. У наставку је дат списак метода које су на располагању, њихове повратне вредности и класе објеката за које их треба позвати.
| Метода | Повратна вредност | Објекат класе |
|---|---|---|
| гетФирст | показивач на почетак листе шуме биномних стабала | БинХеап |
| финдМин | показивач на биномно стабло у чијем корену је минимални кључ | БинХеап |
| гетОрдер | ред стабла | БинТрее |
| сетОрдер | нема | БинТрее |
| гетРоот | показивач на корен биномног стабла | БинТрее |
| гетНумОфЦхилдрен | број потомака чвора биномног стабла | БинНоде |
| гетЦхилдАтПос(индеx) | показивач на чвор који је потомак објекта БинНоде на позицији индеx | БинНоде |
Решење
Следеће претпоставке су усвојене при имплементацији:
getFirstвраћа променљиву референцу на лвредност до почетка уланчане листе, како бисмо могли да ажурирамо тај почетакgetChildAtPosисто враћа променљиву референцу на лвредност. Ово је како бисмо децу тренутног чвора могли да поставимо на нил, како не би била уништена приликом деалокације стабла (претпостављамо да постоји функција ФРЕЕТРЕЕ која то ради, слично ФРЕЕНОДЕ)- Постоји функција ГЕТТРЕЕ која само алоцира стабло и као корен поставља свој први аргумент
- Уланчана листа је једноструко уланчана, па накнадно морамо дохватати елементе листе које садрже стабло са минималним кореном након позивања
findMin - Уланчана листа у хипу садржи поље неxт које показује до следећег чвора уланчане листе и поље валуе које показује на БинТрее објекат, и све операције као што су се користиле на АСП1 су подржане
REMOVE MIN KEY(binheap)
first_node = binheap.getFirst()
if first_node = nil then
return
end_if
min_tree = binheap.getMin()
prev_node = nil
curr_node = first_node
while value(curr_node) ≠ min_tree do
prev_node = curr_node
curr_node = next(curr_node)
end_while
next(prev_node) = next(curr_node)
root = min_tree.getRoot()
for i = 1 to root.getNumOfChildren() do
child = root.getChildAtPos(i)
tree = GETTREE(child)
tree.setOrder(child.getNumOfChildren())
INSERT_TREE(binheap, tree)
root.getChildAtPos(i) = nil
end_for
FREETREE(min_tree)
FREENODE(curr_node)INSERT TREE(binheap, bintree)
curr = binheap.getFirst()
prev = nil
while curr ≠ nil do
if value(curr).getOrder() ≥ bintree.getOrder() then
if prev = nil then
binheap.getFirst() = GETNODE
value(binheap.getFirst()) = bintree
next(binheap.getFirst()) = curr
else
next(prev) = GETNODE
value(next(prev)) = bintree
next(next(prev)) = curr
end_if
return
end_if
prev = curr
curr = next(curr)
end_while
next(prev) = GETNODE
value(next(prev)) = bintree
next(next(prev)) = nil7. задатак
Поставка
Подаци се смештају у хеш табелу са 8 улаза применом хеш функције по методу дељења. За разрешавање колизија се користи метода случајног претраживања (ц = 3). Приказати процес разрешавања колизије и генерисати испитне низове за кључеве 21 и 18. Објаснити да ли код овог метода у општем случају долази до примарног и секундарног груписања и зашто.
Решење
Пошто се користи метода случајног претраживања, морамо генерисати случајни низ за генерисање испитног низа:
011 = 3 *2 110 = 6 *2 1100 -8 100 ⊕3 111 = 7 *2 1110 -8 110 ⊕3 101 = 5 *2 1010 -8 010 ⊕3 001 = 1 *2 010 = 2 *2 100 = 4 *2 1000 -8 000 ⊕3 011 ...
| 21 | 18 |
|---|---|
| 5 | 2 |
| 0 | 5 |
| 3 | 0 |
| 4 | 1 |
| 2 | 7 |
| 6 | 3 |
| 7 | 4 |
| 1 | 6 |
Процес разрешавања колизије:
- 21 % 8 = 5
- Ако је улаз 5 заузет: (5 + 3) % 8 = 0
- Ако је улаз 0 заузет: (5 + 6) % 8 = 3
- итд.
У општем случају неће доћи до примарног груписања јер је секвенца кључева у испитном низу насумична а не линеаарна, али ће доћи до секундарног груписања јер испитни низ зависи само од матичне адресе и редног броја покушаја.
8. задатак
Поставка
Прецизно објаснити како се долази до сложености алгоритама за сортирање а) квадратном селекцијом б) стаблом селекције и ц) спајањем. У којем од ових алгоритама се разликују најбољи, средњи и најгори случај сложености.