Por que o algoritmo de rotação da árvore de reprodução leva em consideração o nó pai e o avô?


25

Não entendo bem por que a rotação na estrutura de dados da árvore de splay está levando em consideração não apenas o pai do nó de classificação, mas também o avô (operação em zig-zag e zig-zig). Por que o seguinte não funcionaria:

À medida que inserimos, por exemplo, um novo nó na árvore, verificamos se inserimos na subárvore esquerda ou direita. Se inserirmos à esquerda, giramos o resultado para a DIREITA e vice-versa para a subárvore direita. Recursivamente seria sth assim

Tree insert(Tree root, Key k){
    if(k < root.key){
        root.setLeft(insert(root.getLeft(), key);
        return rotateRight(root);
    }
    //vice versa for right subtree
}

Isso deve evitar todo o procedimento "splay", você não acha?

Respostas:


30

O algoritmo de balanceamento mais simples pode exigir tempo amortizado por rotação no pior caso. Suponha que a árvore seja apenas um caminho totalmente desequilibrado de crianças certas; nenhum nó tem um filho esquerdo. A única folha nesta árvore é a árvore com a chave máxima. Se você girar esse passo a passo até a raiz, usou rotações e a árvore resultante ainda está totalmente desequilibrada.Ω(n)n−1

mau exemplo por apenas girar

Agora, suponha que promovamos repetidamente todos os nós da árvore, um de cada vez, em ordem decrescente de chave, usando o algoritmo mais simples. Após todas as promoções, a árvore retornou ao seu estado original e usamos aproximadamente rotações. Assim, em média, cada promoção nesta sequência requer rotações ; além disso, posso repetir esse padrão para sempre. Portanto, o custo amortizado para esse algoritmo de promoção é .n2/2Ω(n)Ω(n)

mau exemplo continuou

Este mau exemplo aparece no artigo original da árvore de espalhamento de Sleator e Tarjan.

O algoritmo splay considera não apenas um nó por vez, mas dois nós por vez. Em particular, se o nó que está sendo exibido é o filho certo de um filho certo, o algoritmo de espalhamento primeiro gira o pai de e, em seguida, somente .xxx

mostrando o mau exemplo

A vantagem desse algoritmo mais complexo é que ele não apenas traz o nó acessado para a raiz, mas também move todos os ancestrais do nó acessado aproximadamente até a metade da raiz , mas nunca move qualquer nó a mais do que um número constante de níveis para longe da raiz . raiz.

Sleator e Tarjan provam que o tempo amortizado por jogada é apenas . (A prova usa uma análise de caso tediosa usando uma função de potencial mágico; honestamente, se você estiver curioso, basta ler o artigo original.) É claro que uma única exibição pode levar o tempo , mas começando com uma árvore vazia, você precisa executar muitas inserções e splays para configurar um exemplo tão ruim.O(log⁡n)Ω(n)

Mais brevemente: a distribuição move os nós para cima rapidamente e para baixo lentamente.


Eu acho que os algoritmos de rotação são exatamente os mesmos, o meu é simplesmente mais curto e mais compreensível. Em vez de olhar para os avós, considero apenas os pais em uma etapa rotativa. Não produz exatamente o mesmo resultado?
— precisa saber é o seguinte

Eu acho que você pode estar se referindo a dois algos de SPLAYING, um de cima para baixo, o outro de baixo para cima, e não o meu, está correto? Eu estava me referindo ao meu algo vs espalhar de baixo para cima
— Bober02
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.