A nomeação do método provavelmente é deliberada em alguns livros (por exemplo, CLRS ) porque:
- A lógica para "flutuar para baixo" ou "borbulhar" uma chave em uma pilha binária é direta se você souber qual direção (para cima / para baixo) está indo. Por exemplo, "borbulhar" uma chave é simplesmente uma chamada recursiva nos pais do nó, versus flutuar onde você precisa comparar com cada filho , antes de prosseguir recursivamente.
- Muitos algoritmos que usam heap máximo / min exigem que você aumente ou diminua apenas as teclas, portanto, basta fornecer o método "flutuante" ou "borbulhante" correspondente.
Observe que, se você quiser implementar um método genérico de "chave de ajuste", poderá simplesmente combinar essas duas rotinas para decidir qual direção seguir, com base na necessidade ou não de pressionar ou flutuar a chave.
Para adicionar ao que Hendrick disse, vale a pena notar que, mesmo por exemplo, nos algoritmos de Dijkstra ou Prim, onde tecnicamente é suficiente uma operação de redução de tecla , usar um heap binário não requer necessariamente que você acompanhe a posição de cada tecla.
Nesses algoritmos, uma determinada chave é extraída do heap apenas uma vez . Por exemplo, no Dijkstra, um nó gráfico é adicionado apenas uma vez à árvore de caminhos mais curtos e, no algoritmo de Prim, uma aresta pode ser adicionada apenas uma vez à árvore de abrangência mínima.
Assim, em vez de manter o controle de posições-chave (ou procurá-los quando as necessidades algoritmo para diminuí-los), no pode simplesmente inserir o novo (neste caso, diminuir ) o valor para a chave na pilha (levando a duplicações na pilha) e, depois de extrair a "chave" do heap (tecnicamente dados de satélite, pois a chave não é o que você está consumindo avidamente), você pode ignorar todas as extrações subsequentes (por exemplo, usando um conjunto com ).O ( 1 )
Essas duplicatas de conjunto e chave no heap obviamente custariam em complexidade de espaço, mas você poderia pensar na solução combinada como um método de "tecla de diminuição" que não requer conhecimento ou rastreamento de posições no heap.O ( n )