Изменения

Перейти к: навигация, поиск

Декартово дерево по неявному ключу

338 байт добавлено, 19:25, 4 сентября 2022
м
rollbackEdits.php mass rollback
===Вспомогательная величина С===
Решается эта проблема довольно просто. Основная идея заключается в том, что такой ключ <tex>X</tex> сам по себе нигде не хранится. Вместо него будем хранить вспомогательную величину <tex>C</tex>: '''количество вершин в поддереве нашей вершины''' (в поддерево включается и сама вершина). Обратим внимание, что все операции с обычным декартовым деревом делались сверху. Также заметим, что если по пути от корня до некой вершины просуммировать все такие величины в левых поддеревьях, в которые мы не пошли, увеличенные на единицу, то придя в саму вершину и добавив к этой величине количество элементов в её левом поддереве, мы получим как раз ее ключ <tex>X</tex>.
[[Файл:DDpoNK.png|Пример описанного дерева с демонстрацией определения ключа <tex>X</tex>]]
Псевдокод:
'''<tex>\langle</tex>Treap, Treap<tex>\rangle</tex>''' split('''Treap''' t, '''int''' k) '''if''' t == <tex> \varnothing </tex> '''return''' <tex>\langle</tex><tex> \varnothing </tex>, <tex> \varnothing </tex><tex>\rangle</tex>
'''int''' l = t.left.size
'''if''' l <tex>\small{\geqslant}</tex>= k <tex>\langle</tex>t1, t2<tex>\rangle</tex> = split(t.left, k)
t.left = t2
update(vt) r = v '''return''' <tex>\langle</tex>t1, t2t<tex>\rangle</tex>
'''else'''
<tex>\langle</tex>t1, t2<tex>\rangle</tex> = split(t.right, k - l - 1)
t.right = t1
update(vt) l = v '''return''' <t1tex>\langle</tex>t, t2<tex>\rangle</tex>
===Merge===
Псевдокод:
'''void''' update('''Treap''' t)
t.size = 1 + t.left.size + t.right.size + 1
==Применение описанного дерева==
1632
правки

Навигация