Слайды лекций - 2014 (лектор - Белеванцев А. А.) (1107979), страница 18
Текст из файла (страница 18)
что некоторые операции выполнялись чаще других)Хорошее описание в:Harry R. Lewis, Larry Denenberg. Data Structures andTheir Algorithms. HarperCollins, 1991. Глава 7.3.http://www.amazon.com/Structures-Their-Algorithms-Harry13Lewis/dp/067339736XСамоперестраивающиеся деревья (splay trees)Идея: эвристика Move-to-FrontСписок: давайте при поиске элемента в спискеперемещать найденный элемент в начало спискаЕсли он потребуется снова в обозримом будущем,он найдется быстрееMove-to-Front для двоичного дерева поиска: oперация Splay(K, T)(подравнивание, перемешивание, расширение)После выполнения операции Splay дерево Tперестраивается (оставаясь деревом поиска) так, что:Если ключ K есть в дереве, то он становится корнемЕсли ключа K нет в дереве, то в корне оказываетсяего предшественник или последователь в симметричномпорядке обхода14Реализация словарных операций через splayПоиск (LookUp): выполним операцию Splay(K, T) и проверимзначение ключа в корне:если значение равно K, то ключ найден15Реализация словарных операций через splayВставка (Insert): выполним операцию Splay(K, T) и проверимзначение ключа в корне:если значение уже равно K, то обновим данные ключаесли значение другое, то вставим новый корень К ипоместим старый корень J слева или справа(в зависимости от значения J)16Реализация словарных операций через splayОперация Concat (T1, T2) – слияние деревьев поиска T1 и T2 таких,что все ключи в дереве T1 меньше, чем все ключи в дереве T2,в одно дерево поискаСлияние (Concat): выполним операцию Splay(+∞, T1) со значениемключа, заведомо больше любого другого в T1После Splay(+∞, T1) у корня дерева T1 нет правого сынаПрисоединим дерево T2 как правый сын корня T117Реализация словарных операций через splayУдаление (Delete): выполним операцию Splay(K, T) и проверимзначение ключа в корне:если значение не равно K, то ключа в дереве нет иудалять нам нечегоиначе (ключ был найден) выполним операцию Concatнад левым и правым сыновьями корня, а корень удалим18Реализация операции splayШаг 1: ищем ключ K в дереве обычным способом, запоминаяпройденный путь по деревуМожет потребоваться память, линейная от количестваузлов дереваДля уменьшения количества памяти можновоспользоваться инверсией ссылок (link inversion)○перенаправление указателей на сынаназад на родителя вдоль пути по деревуплюс 1 бит на обозначение направленияШаг 2: получаем указатель P на узел дерева либо с ключом K,либо с его соседом в симметричном порядке обхода, на которомзакончился поиск (сосед имеет единственного сына)Шаг 3: возвращаемся назад вдоль запомненного пути,перемещая узел P к корню (узел P будет новым корнем)19Реализация операции splayШаг 3а): отец узла P – корень дерева (или у P нет деда)выполняем однократный поворот налево или направо20Реализация операции splayШаг 3б): узел P и отец узла P – оба левые или правые детивыполняем два однократных поворота направо (налево),сначала вокруг деда P, потом вокруг отца P21Реализация операции splayШаг 3в): отец узла P – правый сын, а P – левый сын (или наоборот)выполняем два однократных поворота в противоположныхнаправлениях (сначала вокруг отца P направо, потомвокруг деда P налево)22Пример операции splay над узлом DСлучай б): отец узла D (E) и сам узел D – оба левые сыновья23Пример операции splay над узлом DСлучай в): отец узла D (H) – правый сын, а сам узел D – левый сын24Пример операции splay над узлом DСлучай а): отец узла D (L) – корень дерева25Сложность операции splay26Пусть каждый узел дерева содержит некоторую сумму денег.Весом узла является количество ее потомков,включая сам узелРангом узла r(N) называется логарифм ее весаДенежный инвариант: во время всех операций с деревомкаждый узел содержит r(N) рублейКаждая операция с деревом стоит фиксированную суммуза единицу времениЛемма.
Операция splay требует инвестирования не более чем в3lg n + 1 рублей с сохранением денежного инварианта.Теорема. Любая последовательность из m словарных операцийна самоперестраивающемся дереве, которое было изначальнопусто и на каждом шаге содержало не более n узлов, занимаетне более O(m log n) времени.Каждая операция требует не более O(log n) инвестиций,при этом может использовать деньги узлаПо лемме инвестируется всего не более m(3lg n + 1)рублей, сначала дерево содержит 0 рублей, в концесодержит ≥0 рублей – O(m log n) хватает на все операции.Сбалансированные деревья: обобщение через рангиHaeupler, Sen, Tarjan.
Rank-balanced trees. ACM Transactions onAlgorithms, 2014 (to appear).Обобщение разных видов сбалансированных деревьев черезпонятие ранга (rank) и ранговой разницы (rank difference)АВЛ, красно-черные деревья, 2-3 деревья, B-деревьяНовый вид деревьев: слабые АВЛ-деревья (weak AVL)Анализ слабых АВЛ-деревьев, анализ потенциалов27Сбалансированные деревья: понятие рангаРанг (rank) вершины r(x): неотрицательное целое числоРанг отсутствующей (null) вершины равен -1Ранг дерева: ранг корня дереваРанговая разница (rank difference): если у вершины x естьродитель p(x), то это число r(p(x)) – r(x).У корня дерева нет ранговой разницыi-сын: вершина с ранговой разницей, равной i.i,j-вершина: вершина, у которой левый сын – это i-сын,а правый сын – это j-сын.
Один или оба сына могутотсутствовать. i,j- и j,i-вершины не различаются.28Сбалансированные деревья: ранговый формализмКонкретный вид сбалансированного дерева определяетсярангом и ранговым правилом.Ранговое правило должно гарантировать:Высота дерева (h) превосходит его ранг не более чемв константное количество раз (плюс, возможно, O(1))Ранг вершины (k) превосходит логарифм ее размера (n)не более чем в константное количество раз(плюс, возможно, O(1))Размер вершины – число ее потомков, включая себя,т.е.
размер поддерева с корнем в этой вершинеТ.е. h = O (k), k = O (log n) h = O (log n)Совершенное дерево:ранг дерева – его высота; все вершины – 1,1.29Сбалансированные деревья: ранговые правилаАВЛ-правило: каждая вершина – 1,1 или 1,2.Ранг: высота дерева.(или: все ранги положительны, каждая вершина имеет хотя бы одного 1-сына)Можно хранить один бит, указывающий наранговую разницу вершиныКрасно-черное правило: ранговая разница любой вершиныравна 0 или 1, при этом родитель 0-сына не может быть 0-сыном.0-сын – красная вершина, 1-сын – черная вершинаРанг: черная высотаКорень не имеет цвета (т.к. не имеет ранговой разницы!)Слабое АВЛ-правило: ранговая разница любой вершиныравна 1 или 2; все листья имеют ранг 0.Вдобавок к АВЛ-деревьям разрешаются 2,2-вершиныБит на узел для ранговой разницы или ее четностиБалансировка: не более двух поворотов и O(log n)изменений ранга для вставки/удаления, при этомамортизированно – лишь O(1) изменений.30Слабое АВЛ-дерево является красно-черным деревом.