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.
pai-mãe ( i ) r e t u r n ⌊(i-2) / d + 1 ⌋
d-ária-criança ( i , j ) r e t u r n d ( i - 1 ) + j + 1
Obviamente . Você pode verificar essas funções verificando se d-ário-pai ( d-ário-filho ( i , j ) ) = i1 ≤ j ≤ dd-á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.dd= 2d2
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 UXpai-d-áriod-á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-MAXMAX-HEAPIFYO ( d registrod( n ( d- 1 ) ) )
O ( d registrod( n ( d- 1 ) ) ) = O ( d( logd( n ) + log( d- 1 ) ) )= O ( d l o gd( n ) + d registrod( 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≪ ndregistrod( d- 1 )O ( dregistrod( N ) )MAX-HEAPIFYOΘ
O livro CLRS já fornece o procedimento INSERT. Que se parece com isso:
INSERT ( A , k e y) Um . h e a p _ s i ze = Uma . h e a p _ s i ze + 1 Um [ A . h e a p _ s i ze ] = - ∞ AUMENTO-CHAVE ( A , A . H um e um p _ s i ze , k e y)
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:
CHAVE DE AUMENTO ( A , i , k e y) eu f k e y< A [ i ] e r r o r "a nova chave é menor que a atual" A [ i ] = k e y w h i l e i>1umnd A [ i ] > A [ d-ário-pai ( i ) ] A [ i ] ↔ A [ d-ário-pai (i) ] i = pai-mãe-d (i)
O ( logd( N ) )
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 .