АСП2/К1 2016

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Задаци на страници предмета.

1. задатак

Поставка

Ако је инордер обиласком неког стабла бинарног претраживања добијен низ кључева 1 5 8 9 11 14 приказати три могућа изгледа овог стабла са: (а) најмањом висином, (б) највећом висином и (ц) висином између најмање и највеће. Обележити стабло са најбољим и најлошијим перформансама операција.

Решење

Стабло А има најбоље перформансе операција:

    9
   / \
  5   11
 / \    \
1   8    14

Стабло Б има најлошије перформансе операција:

1
 \
  5
   \
    8
     \
      9
       \
        11
          \
           14

Стабло C нема ни најбоље ни најлошије перформансе операција:

        11
       /  \
      9    14
     /
    8
   /
  5
 /
1

2. задатак

Поставка

Дат је низ целих бројева. Користећи стабло бинарног претраживања, написати функцију која мења сваки елемент његовим следбеником. У случају да елемент нема следбеника, задржати оригиналну вредност. Резултат функције је низ преуредјен на описани начин.

Решење

Овде прво пребацујемо задати низ у бинарно стабло претраживања користећи функцију за уметање чвора а затим за сваки елемент низа проналазимо следбеника слично као у другом задатку са првог колоквијума 2018.

ARR TRANSFORM(arr, n)
bst = nil
for i = 1 to n do
    BST-INSERT(bst, arr[i])
end_for
for i = 1 to n do
    key = arr[i]
    p = bst
    prev = nil
    while (p ≠ nil) and (key(p) ≠ key) do
        if key(p) > key then
            prev = p
            p = left(p)
        else
            p = right(p)
        end_if
    end_while
    p = right(p)
    while p ≠ nil do
        prev = p
        p = left(p)
    end_while
    if prev ≠ nil then
        arr[i] = key(prev)
    end_if
end_for
BST-INSERT(bst, key)
node = GETNODE
key(node) = key
if bst = nil then
    bst = node
else
    p = bst
    while true do
        if key(p) > key then
            if left(p) = nil then
                left(p) = node
                break
            else
                p = left(p)
            end_if
        else
            if right(p) = nil then
                right(p) = node
                break
            else
                p = right(p)
            end_if
        end_if
    end_while
end_if

3. задатак

Поставка

Нека је дат растуће уређени низ целих бројева (нпр., 1 2 3 5 7 9) или нека његова ротација (нпр., 5 7 9 1 2 3). Вредности се не понављају у низу. Написати у псеудокоду итеративну функцију која на ефикасан начин проналази минималну вредност у низу.

Решење

Овај проблем се своди на бинарну претрагу са измењеним условима: сада детектујемо да ли се налазимо лево или десно од тражене вредности поредећи се са првим елементом (уколико је тренутни елемент већи од првог, лево смо од тражене вредности) а детекцију тражене вредности тако што проверимо да ли је елемент лево од тренутног већи од њега (то значи да смо дошли на почетак неротираног низа).

FIND MIN(arr, n)
low = 1
high = n
if arr[1] ≤ arr[n] then
    return arr[1]
end_if
while lowhigh do
    mid = (high + low) / 2
    if arr[mid] < arr[mid-1] then
        return arr[mid]
    else if arr[mid] < arr[1] then
        high = mid - 1
    else
        low = mid + 1
    end_if
end_while

4. задатак

Поставка

Бинарно претраживање у повећаној табели

  1. Објаснити на који начин се врши уметање и брисање у повећаној табели.
  2. Дата је повећана табела уређена неопадајуће и одговарајући вектор са битовима валидности. На слици је приказано тренутно стање. Приказати изглед повећане табеле и вектора валидности након уметања сваког од кљуцева: 6, 29 и 35, а затим уклонити кључеве : 18 и 23 и приказати финално стање.
Почетно стање повећане табеле
5 5 9 18 22 22 23 25 28 38 40
1 0 0 1 0 0 0 1 0 1 0

Решење

Уметање се врши тако што прво урадимо (бинарну) претрагу за неки кључ и ако утврдимо да постоји (да постоји кључ са траженом вредношћу у табели и да му је бит валидности постављен на 1) бацамо грешку, у супротном проверавамо бит валидности на пољу до којег смо дошли: ако је 1, морамо померити све валидне кључеве који следе након тог поља за једно место унапред како бисмо могли да убацимо кључ на то поље. При убацивању се бит валидности тог кључа постави на 1, сви следећи невалидни кључеви се поставе на ту вредност а сви претходни на вредност претходног валидног кључа.

При брисању се након претраге за дати кључ, бит валидности кључа само постави на 0 уколико постоји или баци грешка уколико не постоји.

Стање повећане табеле након уноса кључа 6
5 6 6 18 22 22 23 25 28 38 40
1 1 0 1 0 0 0 1 0 1 0
Стање повећане табеле након уноса кључа 29
5 6 6 18 22 22 23 25 25 29 38
1 1 0 1 0 0 0 1 0 1 1
Такође је могуће да се, уз напомену, при наиласку на кључ већи од траженог гледа лево уместо десно.
Стање повећане табеле након уноса кључа 35
5 6 6 18 22 22 23 25 29 35 38
1 1 0 1 0 0 0 1 1 1 1
Постоје два начина на који можемо да решимо ситуацију кад наиђемо на 38 и не можемо да га померимо удесно:
  • кажемо да се десила грешка пошто не можемо даље да умећемо, или
  • померимо кључ 29 улево (препоручено).
Стање повећане табеле након уклањања кључа 18
5 6 6 18 22 22 23 25 29 35 38
1 1 0 0 0 0 0 1 1 1 1

Брисањем кључа 23 дешава се грешка јер тај кључ не постоји.

5. задатак

Поставка

Дато је стабло бинарног претраживања. Да ли стабло задато на слици задовољава критеријум АВЛ стабла? Уколико не, извршити балансирање стабла по АВЛ критеријуму, а затим из добијеног стабла обрисати кључеве 55 и 20, па у стабло уметнути кључ 30. Приликом брисања, користити следбеника. Приказати изглед стабла након сваке извршене измене.

        20
       /  \
     17    32
    /     /  \
  10    25    33
 /     /  \     \
5     22  27     57
                /  \
               55  71

Решење

Видимо да су критични чворови овде 17 и 33. Прво радимо десну ротацију око чвора 17:

      20
    /    \
  10      32
 /  \    /  \
5   17 25    33
      /  \     \
     22  27     57
               /  \
              55  71

чиме тај чвор више није критичан, али због скраћивања дужине левог подстабла чвор 20 постаје критичан. Затим радимо леву ротацију око чвора 33:

      20
    /    \
  10       32
 /  \    /    \
5   17 25      57
      /  \    /  \
     22  27  33   71
               \
                55

чиме чвор 33 више није критичан. На крају, радимо леву ротацију око чвора 20:

             32
          /      \
      20           57
   /      \       /  \
  10      25    33    71
 /  \    /  \     \
5   17  22  27     55

Брише се чвор 55. Чвор је лист тако да је брисање тривијално. Стабло остаје балансирано након брисања овог чвора.

             32
          /      \
      20           57
   /      \       /  \
  10      25    33    71
 /  \    /  \      
5   17  22  27

Бришемо чвор 20. На његово место стављамо његовог следбеника 22.

             32
          /      \
      22           57
   /      \       /  \
  10      25    33    71
 /  \       \      
5   17      27

Умећемо чвор 30 као десног сина 27.

             32
          /      \
      22           57
   /      \       /  \
  10      25    33    71
 /  \       \      
5   17       27
               \
                30

Његовим уметањем чвор 25 постаје критичан па зато радимо ротацију улево око њега и тиме добијамо...

Коначно стабло:

             32
          /      \
      22           57
   /      \       /  \
  10      27    33    71
 /  \    /  \      
5   17 25    30

6. задатак

Поставка

Црвено-црно стабло из поставке задатка.

У црвено-црном стаблу са слике се најпре изврши брисање кључа 35, а затим уметање кључева 9, 43, 10. Приказати изглед стабла након сваке од наведених промена.

Решење

7. задатак

Поставка

  1. У псеудокоду написати функцију која за АВЛ стабло задате висине х израчунава најмањи број чворова које стабло може да садржи.
  2. На којој висини може да се налази лист најближи корену?
  3. Како се називају оваква стабла и по чему су добила име?

Решење

  1. Псеудокод је дат испод.
  2. цеил(х / 2). Ово је зато што су подстабла Фибоначијевих стабала исто Фибоначијева стабла, тако да се најмања висина листа израчунава као најмања висина листа Фибоначијевог стабла чија је висина за 2 мања од тренутног увећана за 1.
  3. Оваква стабла, која су најгори случајеви АВЛ стабала, добила су име по Фибоначијевим бројевима чија се рекурзивна дефиниција веома мало разликује од рекурзивне дефиниције броја чворова оваквих стабала у зависности од њихове висине.
AVL MIN NODES(h)
if h = 0 then
    return 1
else if h = 1 then
    return 2
else
    return AVL_MIN_NODES(h - 1) + AVL_MIN_NODES(h - 2) + 1
end_if

8. задатак

Поставка

За стабло бинарног претраживања које садржи кључеве К1 < К2 < ... < Кн и чији је корен кључ Кр извести везу цене стабла и цена подстабла. Обавезно објаснити поступак.

Решење

Цена подстабла се дефинише као:

где су вероватноће успешног, неуспешног претраживања а висине чворова .

Узимамо да су први чвор левог подстабла и последњи чвор десног подстабла тренутног чвора по инордер поретку и а тренутни чвор . Пошто је висина у формули за цене левог и десног подстабла сада повећана за 1, добијамо да је укупна цена тренутног чвора једнака: