Изменения

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

Rope

163 байта добавлено, 19:08, 4 июня 2014
Нет описания правки
===Время работы===
Асимптотика выполнения операции конкатенации двух строк очевидно <tex>\mathrm{O(1)}</tex>.
==Получение символа по индексу==
===Время работы===
Асимптотика выполнения одного такого запроса очевидно <tex>\mathrm{O(h)}</tex>, где <tex>h</tex> {{---}} высота дерева.
==Split==
Чтобы разбить строку на две по некоторому индексу <tex>\mathrm{i}</tex> необходимо спускаясь по дереву (аналогично операции <tex>\mathrm{get}</tex>), каждую вершину на пути поделить на две, каждая из которых будет соответствовать одно из половинок строк, при этом необходимо после деления пересчитать вес этих вершин.
Пускай дано дерево:
[[file:Split1.png|800px|Перед операцией split.]]
Тогда результатом выполнения операции <tex>\mathrm{split}</tex> по индексу 16 будет:
[[file:Split2.png|800px|Результат выполнения операции split.]]
Заметим, что появляются лишние вершины, у которых есть только один потомок. От них можно легко избавится, просто заменив их на этого потомка. Тогда результатом той же операции <tex>\mathrm{split}</tex> будет:
[[file:Split3.png|800px|Результат выполнения операции split.]]
===Время работы===
Нетрудно заметить что асимптотическая сложность выполнения данной операции <tex>\mathrm{O(h)}</tex>, где <tex>h</tex> {{---}} высота дерева.
==Операции удаления и вставки==
Нетрудно понять, что имея операция <tex>\mathrm{merge}</tex> и <tex>\mathrm{split}</tex>, можно легко через них выразить операции <tex>\mathrm{delete}</tex> и <tex>\mathrm{insert}</tex> по аналогии с другими деревьями поиска.
Операция <tex>\mathrm{delete}</tex> удаляет из строки подстроку начиная с индекса <tex>beginIndex</tex> и заканчивая (не включая) индексом <tex>endIndex</tex>.
===Псевдокод===
'''return''' merge(t1, t3)
Операция <tex>\mathrm{insert}</tex> вставляет данную строку <tex>s</tex> в исходную начиная с позиции <tex>insertIndex</tex>.
===Псевдокод===
===Время работы===
Так как данные операции используют только <tex>\mathrm{split}</tex> и <tex>\mathrm{merge}</tex> то асимптотика времени их работы <tex>\mathrm{O(h)}</tex>, где <tex>h</tex> - высота дерева.
==Балансировка==
[[file:Bamboo.png|800px|Пример вырождения дерева в бамбук.]]
Предлагается хранить его как [[АВЛ-дерево]] и делать соответствующие балансировки. Тогда, так как высота АВЛ-дерева <tex>h = \log{n}</tex>, то асимптотика операций <tex> \mathrm{get, split, delete, insert, merge}</tex> будет равна <tex>\mathrm{O(\log{n})}</tex>, где <tex>n</tex> - количество сконкатенированных строк.
==Оптимизации==
91
правка

Навигация