АСП2/К3 2019
Postavka sa stranice predmeta.
1. zadatak
Postavka
Upotrebom metode heširanja implementirati funkciju FIND_NUM_OF_PAIRS koja treba da pronađe ukupan broj parova celobrojnih vrednosti u zadatom nizu arr koji u sumi po modulu n daju vrednost k koja predstavlja parametar funkcije. Za realizaciju ove funkcije treba koristiti metodu odvojenog ulančavanja.
Rešenje
Ovde nema potrebe koristiti bilo kakvo ulančavanje jer je counting sort dovoljan da izbroji ključeve koji daju neku vrednost po modulu n a zatim izmnoži izbrojano. Na primer, za n = 7 i k = 1 na sumu se redom dodaju:
FIND NUM OF PAIRS(arr, n, k) for i = 0 to n-1 do C[i] = nil end_for for i = 1 to LENGTH(arr) do adr = arr[i] mod n if C[adr] = nil then C[adr] = GETNODE value(C[adr]) = arr[i] next(C[adr]) = nil else curr = next(C[adr]) prev = C[adr] while curr ≠ nil do prev = curr curr = next(curr) end_while next(prev) = GETNODE value(next(prev)) = arr[i] next(next(prev)) = nil end_if end_for count = 0 for i = 0 to n-1 do node_count_1 = 0 curr = C[i] while curr ≠ nil do node_count_1 = node_count_1 + 1 curr = next(curr) end_while node_count_2 = 0 j = (k - i) mod n curr = C[j] while curr ≠ nil do node_count_2 = node_count_2 + 1 curr = next(curr) end_while if i = j then count = count + node_count_1 * (node_count_1 - 1) / 2 else count = count + node_count_1 * node_count_2 / 2 end_if end_for for i = 0 to n-1 do curr = C[i] while curr ≠ nil do tmp = curr curr = next(curr) FREENODE(tmp) end_while end_for return count
2. zadatak
Postavka
Prikazati izgled binomnog hipa nakon svake izmene, ukoliko se umeću ključevi 19, 11, 25 i nakon toga obriše minimum.
Rešenje
Ispod je dato konačno rešenje zadatka, a koraci se mogu simulirati u simulatoru binomnih hipova, redom umetanjem ključeva 14, 27, 12, 23, 15, 22, 5, 9 i 17, pa zatim izvršavati zadate operacije.
3. zadatak
Postavka
Data je sekvenca ključeva: 27, 25, 14, 34, 7, 1, 5, 193, 33, 41, 73, 124. Prikazati rad radix sort algoritma po koracima.
Rešenje
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
1 | 193 | 14 | 25 | 27 | |||||
41 | 33 | 34 | 5 | 7 | |||||
73 | 124 |
Dobijena sekvenca posle prvog koraka: 1, 41, 193, 33, 73, 14, 34, 124, 25, 5, 27, 7
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
1 | 14 | 124 | 33 | 41 | 73 | 193 | |||
5 | 25 | 34 | |||||||
7 | 27 |
Dobijena sekvenca posle drugog koraka: 1, 5, 7, 14, 124, 25, 27, 33, 34, 41, 73, 193.
Treći korak neće biti prikazan jer će u suštini samo prve dve kolone biti jako popunjene, ali se na kraju dobija poredak: 1, 5, 7, 14, 25, 27, 33, 34, 41, 73, 124, 193.
4. zadatak
Postavka
Podaci se smeštaju u heš tabelu sa 10 ulaza primenom heš funkcije hp(K) = K mod 10. Za razrešavanje kolizija se koristi metoda objedinjenog ulančavanja. Prikazati popunjavanje date tabele nakon umetanja svakog od sledećih ključeva: 37, 41, 18, 16, 12. Nakon svih umetanja, odrediti verovatnoću popunjavanja praznih ulaza, pod pretpostavkom da su svi ključevi jednako verovatni.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
11 | 21 | 29 | |||||||
-1 | 8 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
free |
Rešenje
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
11 | 37 | 21 | 29 | ||||||
-1 | 8 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
free |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
11 | 41 | 37 | 21 | 29 | |||||
-1 | 8 | -1 | -1 | -1 | -1 | -1 | -1 | 6 | -1 |
free |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
11 | 18 | 41 | 37 | 21 | 29 | ||||
-1 | 8 | -1 | -1 | -1 | -1 | 5 | -1 | 6 | -1 |
free |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
11 | 16 | 18 | 41 | 37 | 21 | 29 | |||
-1 | 8 | -1 | -1 | -1 | 4 | 5 | -1 | 6 | -1 |
free |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
11 | 12 | 16 | 18 | 41 | 37 | 21 | 29 | ||
-1 | 8 | -1 | -1 | -1 | 4 | 5 | -1 | 6 | -1 |
free |
Verovatnoća popunjavanja ulaza 0 je , jer se on popunjava samo ukoliko se umeće broj kongruentan sa 0 po modulu 10. Verovatnoća popunjavanja ulaza 3 je, stoga, , jer se on popunjava za bilo koji drugi moduo.
5. zadatak
Postavka
Priloženi pseudokod prikazuje algoritam za uređivanje špila karata u jednoj kartaškoj igri. U igri se koristi špil od po 8 karata za svaki od 4 znaka (ukupno 32). Algoritam treba da grupiše karte istog znaka, pri čemu karte istog znaka sortira prema rastućoj vrednosti. Uočiti i objasniti greške ili nedostatke priloženog algoritma i napisati u pseudokodu ispravnu implementaciju u skladu sa zahtevima. Polje val predstavlja vrednost karte, a polje sign njen znak.
for i = 2 to 32 do k = cards[i] j = i-1 while(j>0 and cards[j].val>k.val) do cards[j+1] = cards[j] j = j-1 end_while cards[j] = k end_for for i = 1 to 4 do c[i] = 0 end_for for j = 1 to n do c[cards[j].sign] = c[cards[j].sign]+1 end_for for i = 3 downto 1 do c[i] = c[i+1] - c[i] end_for for j = 1 to n do b[c[cards[j].sign]] = cards[j] c[cards[j].sign] = c[cards[j].sign]-1 end_for
Rešenje
Sledeće greške su uočene:
- Niz
cards
počinje od 1 a na krajuwhile
petlje se postavljacards[j]
na vrednostk
, s tim što je jedan od uslova petljej > 0
. Ovde se mora prepraviti nacards[j + 1]
. - Counting sort implementacija za sortiranje po znaku ne radi.
SORT(cards) for i = 2 to 32 do k = cards[i] j = i - 1 while (j > 0) and (val(cards[j]) > val(k)) do cards[j + 1] = cards[j] j = j - 1 end_while cards[j + 1] = k end_for for i = 1 to 4 do c[i] = 0 end_for for j = 1 to n do c[sign(cards[j])] = c[sign(cards[j])] + 1 end_for for i = 2 to 4 do c[i] = c[i-1] + c[i] end_for for j = n downto 1 do b[c[sign(cards[j])]] = cards[j] c[sign(cards[j])] = c[sign(cards[j])] - 1 end_for
6. zadatak
Postavka
Koristeći ideju quick sort algoritma, napisati u pseudokodu funkciju koja vraća k-ti najmanji element u zadatom nizu celih brojeva arr. Prilikom izbora pivot-a, koristiti medijanu od tri pogodno izabrane vrednosti.
Rešenje
QUICK SELECT(arr, k) min = FIND(arr, 1, n, k) return min FIND(a, low, high, k) j = PARTITION(a, low, high) i = low + k - 1 if i = j then return a[i] end_if if j > i then return FIND(a, low, j - 1, k) else return FIND(a, j + 1, high, k - j) end_if PARTITION(a, down, up) i = down j = up pivot_pos = MEDIAN(a[i], i, a[j], j, a[(i + j) / 2], (i + j) / 2) pivot = a[pivot_pos] while i < j do while (a[i] ≤ pivot) and (i < j) do i = i + 1 end_while while a[j] > pivot do j = j - 1 end_while if i < j then if j == pivot_pos then pivot_pos = i end_if a[i] ↔ a[j] end_if end_while a[pivot_pos] = a[j] a[j] = pivot return j MEDIAN(a, pos_a, b, pos_b, c, pos_c) if (a > b) xor (a > c) then return pos_a else if (b < a) xor (b < c) then return pos_b else return pos_c end_if
7. zadatak
Postavka
Podaci se smeštaju u heš tabelu sa 9 ulaza primenom heš funkcije hp(K)=K mod 9. Za razrešavanje kolizija se koristi metoda linearnog pretraživanja sa korakom 2. Definisati pojam primarnog i sekundarnog grupisanja, a zatim na primeru delimično popunjene tabele sa slike, ilustrovati jedan scenario umetanja kod kojeg se dešava primarno grupisanje i jedan scenario umetanja kod kojeg se dešava sekundarno grupisanje.
0 | 27 |
---|---|
1 | |
2 | 11 |
3 | |
4 | |
5 | 23 |
6 | |
7 | |
8 | 8 |
Rešenje
Sekundarno grupisanje je kada heš funkcija za dva različita ključa vraća istu matičnu adresu, pa su im i ispitni nizovi jednaki. Kada umetnemo ključ 18, dobijamo sekundarno grupisanje:
- 18 % 9 = 0 (ovde se desilo sekundarno grupisanje, jer ključevi 27 i 18 imaju istu matičnu adresu 0)
- (0 + 2) % 9 = 2 (ovde se desilo primarno grupisanje, jer se ispitni niz po modulu 0 i ispitni niz po modulu 2 ovde preklapaju)
- (2 + 2) % 9 = 4
0 | 27 |
---|---|
1 | |
2 | 11 |
3 | |
4 | 18 |
5 | 23 |
6 | |
7 | |
8 | 8 |
Primarno grupisanje je kada se dva ispitna niza od različitih matičnih adresa preklope. Ta pojava se takođe može ilustrovati na primeru umetanja ključa 20:
- 20 % 9 = 2 (ovde se desilo sekundarno grupisanje, jer ključevi 11 i 20 imaju istu matičnu adresu 2)
- (2 + 2) % 9 = 4 (ovde se desilo primarno grupisanje, jer se ispitni nizovi po modulu 2 i po modulu 0 ponovo preklapaju)
- (4 + 2) % 9 = 6
0 | 27 |
---|---|
1 | |
2 | 11 |
3 | |
4 | 18 |
5 | 23 |
6 | 20 |
7 | |
8 | 8 |
8. zadatak
Postavka
Neka se kod spoljašnjeg heširanja koristi heš tabela sa 4 baketa, koji imaju kapacitet b = 3. Za heš funkciju se koristi metod deljenja K mod 4, a za razrešavanje kolizije linearno pretraživanje. Neka se pri brisanju koristi metod selektivnog pomeranja (analogno kao kod unutrašnjeg heširanja). U tabelu treba umetnuti ključeve 60, 18, 23, 50, 47, 34, 82, 14, 67 i 38, a zatim brisati ključeve 50, 47, 23 i 34. Prikazati izgled tabele nakon svakog razrešenja kolizije pri umetanju, kao nakon svakog brisanja.
Rešenje
Konačan izgled heš tabele je:
60 | 14 | 18 | 82 | 38 | 67 |
---|