Чому в алгоритмі обертання дерева splay враховується як батьківський, так і дідовий вузол?


25

Я не зовсім розумію, чому обертання в структурі даних дерева splay враховує не тільки батьківського вузла рейтингу, але й бабусю і дідуся (операція зіг-заг та зиг-зиг). Чому б наступне не працювало:

Наприклад, коли ми вставляємо, наприклад, новий вузол до дерева, ми перевіряємо, чи вставляємо його в ліве або праве піддерево. Якщо ми вставимо вліво, ми повернемо результат ВПРАВО, і навпаки для правого піддерева. Рекурсивно було б так, як це

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

Це повинно уникати всієї процедури "хитрощі", ви не думаєте?

Відповіді:


30

Простіший алгоритм балансування може вимагати амортизованого часу за обертання в гіршому випадку. Припустимо, дерево - це лише абсолютно незбалансований шлях правильних дітей; жоден вузол не залишив дитину. Єдиний листок на цьому дереві - це дерево з максимальним ключем. Якщо ви обертаєте цей крок за кроком до кореня, ви використовували n - 1 обертів, і отримане дерево все ще є абсолютно неврівноваженим.Ω(н)н-1

поганий приклад для просто обертання

Тепер припустимо, що ми неодноразово просуваємо кожен вузол на дереві, по одному, у зменшенні порядку ключів, використовуючи простіший алгоритм. Після того, як будуть зроблені всі рекламні кампанії, дерево повернулося до початкового стану, і ми використовували його приблизнон2/2Ω(н)Ω(н)

поганий приклад тривав

Цей поганий приклад з'являється в оригінальній деревній папері Sleator і Tarjan.

ххх

плетіння поганого прикладу

Перевага цього більш складного алгоритму полягає в тому, що він не тільки підводить доступ до вузла до кореня, але і переміщує кожного предка звернутого вузла приблизно на півдорозі до кореня , але ніколи не переміщує будь-який вузол більше постійної кількості рівнів від старого корінь.

О(журналн)Ω(н)

Коротше: Грає переміщення вузлів швидко вгору і повільно вниз.


Я думаю, що алгоритми повороту абсолютно однакові, мій просто коротший і зрозуміліший. Замість того, щоб дивитись на бабусь і дідусів, я вважаю батьків лише одним обертовим кроком. Хіба це не має точно такого ж результату?
Bober02

Я думаю, ви можете мати на увазі два ігрових символи, один зверху вниз, інший знизу вгору, а не мій, це правильно? Я мав на увазі моє альго проти "знизу вгору"
Bober02
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.