Perché l'algoritmo di rotazione dell'albero di splay tiene conto sia del nodo genitore che del nodo nonno?


25

Non capisco bene perché la rotazione nella struttura dei dati dell'albero di visualizzazione stia prendendo in considerazione non solo il genitore del nodo di classificazione, ma anche il nonno (operazione a zig-zag e zig-zig). Perché non dovrebbe funzionare quanto segue:

Quando inseriamo, ad esempio, un nuovo nodo nella struttura, controlliamo se inseriamo nella sottostruttura sinistra o destra. Se inseriamo a sinistra, ruotiamo il risultato DESTRA e viceversa per la sottostruttura destra. Ricorsivamente sarebbe stato così

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

Ciò dovrebbe evitare l'intera procedura di "splay", non credi?

Risposte:


30

L'algoritmo di bilanciamento più semplice può richiedere tempo ammortizzato per rotazione nel caso peggiore. Supponiamo che l'albero sia solo un percorso totalmente sbilanciato di bambini giusti; nessun nodo ha un figlio sinistro. L'unica foglia in questo albero è l'albero con la chiave massima. Se ruotate questo passaggio gradualmente fino alla radice, avete usato n - 1 rotazioni e l'albero risultante è ancora totalmente sbilanciato.Ω(n)n-1

cattivo esempio solo per la rotazione

n2/2Ω(n)Ω(n)

il cattivo esempio è continuato

Questo cattivo esempio appare nella carta dell'albero di splay originale di Sleator e Tarjan.

XXX

mostrando il cattivo esempio

Il vantaggio di questo algoritmo più complesso è che non solo porta il nodo accessibile alla radice, ma sposta anche tutti gli antenati del nodo accessibile all'incirca a metà strada dalla radice , ma non sposta mai nessun nodo più di un numero costante di livelli dal radice.

O(logn)Ω(n)

Più brevemente: lo splaying sposta i nodi verso l'alto rapidamente e verso il basso lentamente.


Penso che gli algoritmi di rotazione siano esattamente gli stessi, il mio è semplicemente più breve e più comprensibile. Invece di guardare i nonni, considero il genitore solo in una fase di rotazione. Non fa esattamente lo stesso risultato?
Bober02,

Immagino che potresti riferirti a due alghe SPLAYING, uno dall'alto in basso, l'altro dal basso in alto, e non il mio, è corretto? Mi riferivo al mio algo vs
splaying
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.