Loading [MathJax]/jax/output/CommonHTML/jax.js
  1. Considere max-heaps ternários, isto é, com até 3 filhos por nó, ao invés de 2. Continuamos tendo o máximo em A[1], mas agora os filhos de A[1] serão A[2], A[3] e A[4]; os filhos de A[2] serão A[5], A[6] e A[7]; e assim por diante. Sua tarefa será programar a operação Max-Heapify. Lembrando a operação abaixo para max-heaps binários, escreva um procedimento análogo para max-heaps ternários.

    1:procedure Max-Heapify(A,i)

    2:lLeft(i)

    3:rRight(i)

    4:if lheap-size[A] and A[l]>A[i] then

    5:largestl

    6:else

    7:largesti

    8:end if

    9:if rheap-size[A] and A[r]>A[largest] then

    10:largestr

    11:end if

    12:if largest>i then

    13:A[i]A[largest]

    14:Max-Heapify(A,largest)

    15:end if

    16:end procedure

    Não esqueça de redefinir funções análogas às dos heaps binários para obter os índices dos filhos e pai de cada índice. Lembre-se que temos agora três filhos: Left, Middle e Right, além do Parent. Para ajudar, eis as funções para heaps binários:

    Left(i) = 2i
    Right(i) = 2i+1
    Parent(i) = i/2

    Solução:

    Left(i) = 3i1
    Middle(i) = 3i
    Right(i) = 3i+1
    Parent(i) = (i+1)/3

    1:procedure Max-Heapify(A,i)

    2:lLeft(i)

    3:mMiddle(i)

    4:rRight(i)

    5:if lheap-size[A] and A[l]>A[i] then

    6:largestl

    7:else

    8:largesti

    9:end if

    10:if mheap-size[A] and A[m]>A[largest] then

    11:largestm

    12:end if

    13:if rheap-size[A] and A[r]>A[largest] then

    14:largestr

    15:end if

    16:if largest>i then

    17:A[i]A[largest]

    18:Max-Heapify(A,largest)

    19:end if

    20:end procedure