Fiquei confuso ao resolver o seguinte problema (perguntas 1 a 3).
Questão
Uma pilha d -ary é como uma pilha binária, mas (com uma possível exceção) nós não-folha têm filhos d em vez de dois filhos.
Como você representaria um d pilha -ary em uma matriz?
O que é a altura de um d montão -ary de n elementos em termos de n e d ?
Forneça uma implementação eficiente do EXTRACT-MAX em um h-max d -ary. Analise seu tempo de execução em termos de d e n .
Forneça uma implementação eficiente do INSERT em um d -ary max-heap. Analise seu tempo de execução em termos de d e n .
Forneça uma implementação eficiente de INCREASE-KEY ( A , i , k ), que sinaliza um erro se k <A [i] = k e atualiza a estrutura de heap da matriz d -ary adequadamente. Analise seu tempo de execução em termos de d e n .
Minha solução
Dê uma matriz
→ Minha notação parece um pouco sofisticada. Existe algum outro mais simples?
Deixe h denota a altura da pilha d- ar.
Suponha que a pilha seja uma árvore d- ar completa
Esta é a minha implementação:
EXTRACT-MAX(A) 1 if A.heapsize < 1 2 error "heap underflow" 3 max = A[1] 4 A[1] = A[A.heapsize] 5 A.heap-size = A.heap-size - 1 6 MAX-HEAPIFY(A, 1) 7 return max MAX-HEAPIFY(A, i) 1 assign depthk-children to AUX[1..d] 2 for k=1 to d 3 compare A[i] with AUX[k] 4 if A[i] <= AUX[k] 5 exchange A[i] with AUX[k] 6 k = largest 7 assign AUX[1..d] back to A[depthk-children] 8 if largest != i 9 MAX-HEAPIFY(A, (2+(1+d+d^2+..+d^{k-1})+(largest-1) )
O tempo de execução de MAX-HEAPIFY:
c i
que indica o custo da i- ésima linha acima.EXTRATO-MÁX:
→ Esta é uma solução eficiente? Ou há algo errado na minha solução?
h = (log [nd−1+1])− 1
Assim, acima da explicação para altura não será verdadeira. h = log [nd − 1 + 1] −1 = log [nd] -1 = log [n] Embora, no entanto, a altura da árvore seja escrita comoΘ(log(n)).
Nota: o log está sempre na base d para um heap d-ário .Respostas:
Sua solução é válida e segue a definição de pilha d -ary. Mas, como você apontou, sua notação é um pouco sofisticada.
Você pode usar essas duas funções a seguir para recuperar o pai do i- ésimo elemento e j- ésimo filho do i- ésimo elemento.
Obviamente . Você pode verificar essas funções verificando se d-ário-pai ( d-ário-filho ( i , j ) ) = i1 ≤ j ≤ d d-ário-pai ( d-ário-filho ( i , j ) ) = i
Também é fácil ver que a pilha binária é um tipo especial de pilha -ary onde d = 2 , se você substituir d por 2 , verá que elas correspondem às funções PARENT, LEFT e RIGHT mencionadas no livro.d d= 2 d 2
Se entendi sua resposta corretamente, você usa uma progressão geométrica . No seu caso, você começa , que é obviamente log d ( nh = l o gd( nd- 1 + 1 ) - 1 , que de fato é uma solução válida e correta. Mas apenas para lidar com flutuações constantes, você pode querer escrever Θ ( log d ( n ) ) .registrod( nd) - 1 = logd( n ) + logd( d) - 1 = logd( N ) + 1 - 1 = logd( N ) Θ ( logd( N ) )
A razão para isto é que alguns montes não pode ser equilibrada, assim que seu caminho mais longo e caminho shorthest migt variam de acordo com alguma constante , usando Θ notação que eliminar este problema.c Θ
Você não precisa reimplementar o procedimento fornecido no livro didático, mas deve alterá-lo um pouco, por exemplo, atribuindo todos os filhos à tabela usando as funções d-ário-pai e d-ário-filho .A UX pai-d-ário d-ária-criança
Como o não foi alterado, depende do tempo de execução de MAX-HEAPIFY . Em sua análise, agora você deve usar o pior caso, proporcional à altura e ao número de filhos que cada nó deve examinar (que é no máximo d ). Mais uma vez, sua análise é muito precisa. No final, você obtém O ( d log d ( n ( d - 1 ) ) ) , que pode ser transformado em:EXTRACT-MAX MAX-HEAPIFY O ( d registrod( n ( d- 1 ) ) )
Por razões práticas, sempre podemos assumir que , para que possamos perder a parte d log d ( d - 1 ) da notação O , então obteremos O ( d log d ( n ) ) . O que também é uma solução válida. Mas não é de surpreender que você também possa analisar o tempo de execução das funções usando o teorema mestre , que mostrará que MAX-HEAPIFY não é apenas O, mas Θ .d≪ n dregistrod( d- 1 ) O ( dregistrod( N ) ) MAX-HEAPIFY O Θ
O livro CLRS já fornece o procedimento INSERT. Que se parece com isso:
Pode ser facilmente comprovado, mas o senso comum exige que a complexidade do tempo seja . É porque o heap pode ser atravessado até a raiz.O ( logd( N ) )
Assim como INSERT, INCREASE-KEY também é definido no livro como:
fonte
fonte
A resposta para a segunda questão é h = log d (n (d-1) + 1) - 1 Então, h = log d (nd - n + 1) - 1
fonte