Верхнее дерево

Структура данных

Верхнее дерево — это структура данных, основанная на двоичном дереве для некорневых динамических деревьев , которая используется в основном для различных операций, связанных с путями. Она позволяет использовать простые алгоритмы «разделяй и властвуй» . С тех пор она была расширена для динамического поддержания различных свойств дерева, таких как диаметр, центр и медиана.

Верхнее дерево определяется для базового дерева и набора из не более чем двух вершин, называемых внешними граничными вершинами. {\displaystyle \Re } Т {\displaystyle {\mathcal {T}}} Т {\displaystyle \partial {T}}

Изображение, изображающее верхнее дерево, построенное на базовом дереве (черные узлы). Дерево, разделенное на краевые кластеры, и полное верхнее дерево для него. Заполненные узлы в верхнем дереве — это кластеры путей, а маленькие круглые узлы — это листовые кластеры. Большой круглый узел — это корень. Заглавные буквы обозначают кластеры, не заглавные буквы — это узлы.

Глоссарий

Граничный узел

См. Граничную вершину

Граничная вершина

Вершина в связанном поддереве является граничной вершиной, если она соединена с вершиной вне поддерева ребром.

Внешние граничные вершины

До пары вершин в верхнем дереве можно назвать внешними граничными вершинами, их можно рассматривать как граничные вершины кластера, представляющего все верхнее дерево. {\displaystyle \Re }

Кластер

Кластер — это связанное поддерево с максимум двумя граничными вершинами. Набор граничных вершин данного кластера обозначается как С каждым кластером пользователь может связать некоторую метаинформацию и указать методы для ее поддержания в рамках различных внутренних операций. С {\displaystyle {\mathcal {C}}} С . {\displaystyle \partial {C}.} С {\displaystyle {\mathcal {C}}} я ( С ) , {\displaystyle I({\mathcal {C}}),}

Путь Кластера

Если содержит хотя бы одно ребро, то это называется кластером путей . π ( С ) {\displaystyle \pi ({\mathcal {C}})} С {\displaystyle {\mathcal {C}}}

Точечный кластер

См. кластер листьев

Скопление листьев

Если кластер не содержит ни одного ребра, т.е. имеет только одну граничную вершину, то он называется листовым кластером . π ( С ) {\displaystyle \pi ({\mathcal {C}})} С {\displaystyle {\mathcal {C}}} С {\displaystyle {\mathcal {C}}}

Крайний кластер

Кластер, содержащий одно ребро, называется краевым кластером .

Кластер края листа

Лист в исходном кластере представлен кластером с единственной граничной вершиной и называется кластером граничных листьев .

Кластер края пути

Краевые кластеры с двумя граничными узлами называются краевыми кластерами пути .

Внутренний узел

Узел в \ называется внутренним узлом С {\displaystyle {\mathcal {C}}} С {\displaystyle \partial {C}} С . {\displaystyle {\mathcal {C}}.}

Путь кластера

Путь между граничными вершинами называется кластерным путем и обозначается как С {\displaystyle {\mathcal {C}}} С {\displaystyle {\mathcal {C}}} π ( С ) . {\displaystyle \pi ({\mathcal {C}}).}

Объединяемые кластеры

Два кластера и являются объединяемыми, если — одноэлементный набор (у них есть ровно один общий узел), а — кластер. А {\displaystyle {\mathcal {A}}} Б {\displaystyle {\mathcal {B}}} А Б {\displaystyle {\mathcal {A}}\cap {\mathcal {B}}} А Б {\displaystyle {\mathcal {A}}\cup {\mathcal {B}}}

Введение

Верхние деревья используются для поддержания динамического леса (набора деревьев) при операциях по связыванию и рубке.

Основная идея заключается в поддержании сбалансированного бинарного дерева логарифмической высоты по числу узлов в исходном дереве (т.е. по времени); верхнее дерево по сути представляет собой рекурсивное подразделение исходного дерева на кластеры. {\displaystyle \Re } Т {\displaystyle {\mathcal {T}}} О ( бревно н ) {\displaystyle {\mathcal {O}}(\log n)} Т {\displaystyle {\mathcal {T}}}

В целом дерево может иметь нагрузку на края. Т {\displaystyle {\mathcal {T}}}

Существует однозначное соответствие между ребрами исходного дерева и конечными узлами верхнего дерева , а каждый внутренний узел представляет собой кластер, образованный в результате объединения кластеров, являющихся его дочерними узлами. Т {\displaystyle {\mathcal {T}}} {\displaystyle \Re } {\displaystyle \Re }

Структура данных верхнего дерева может быть инициализирована вовремя . О ( н ) {\displaystyle {\mathcal {O}}(n)}

Следовательно, верхнее дерево над ( ) является бинарным деревом, таким что {\displaystyle \Re } Т , {\displaystyle {\mathcal {T}},} Т {\displaystyle \partial {T}}

  • Узлы представляют собой кластеры ( ); {\displaystyle \Re } Т , {\displaystyle {\mathcal {T}},} Т {\displaystyle \partial {T}}
  • Листья - это края {\displaystyle \Re } Т ; {\displaystyle {\mathcal {T}};}
  • Родственные кластеры являются соседями в том смысле, что они пересекаются в одной вершине, а их родительский кластер является их объединением.
  • Корнем является само дерево с набором из не более чем двух внешних граничных вершин. {\displaystyle \Re } Т {\displaystyle {\mathcal {T}}}

Дерево с одной вершиной имеет пустую вершину, а дерево с одним ребром — всего один узел.

Эти деревья можно свободно дополнять, что обеспечивает пользователю большую гибкость и производительность, не вдаваясь в детали внутренней работы структуры данных, которую также называют « черным ящиком» .

Динамические операции

Ниже приведены три допустимых пользователем обновления леса.

  • Link(v, w): где и являются вершинами в разных деревьях 1 и 2. Возвращает одно верхнее дерево, представляющее v w в {\displaystyle v} ж {\displaystyle w} Т {\displaystyle {\mathcal {T}}} Т {\displaystyle {\mathcal {T}}} {\displaystyle \Re } {\displaystyle \чашка} {\displaystyle \Re } ( в , ж ) {\displaystyle \cup {(v,w)}}
  • Cut(v, w) : удаляет ребро из дерева с верхним деревом, тем самым превращая его в два дерева v и w и возвращая два верхних дерева v и w . ( в , ж ) {\displaystyle {(v,w)}} Т {\displaystyle {\mathcal {T}}} , {\displaystyle \Re ,} Т {\displaystyle {\mathcal {T}}} Т {\displaystyle {\mathcal {T}}} {\displaystyle \Re } {\displaystyle \Re }
  • Expose(S) : Вызывается как подпрограмма для реализации большинства запросов на верхнем дереве. Содержит не более 2 вершин. Он делает исходные внешние вершины обычными вершинами и делает вершины из новых внешних граничных вершин верхнего дерева. Если непусто, он возвращает новый корневой кластер с Expose({v,w}) завершается неудачей, если вершины принадлежат разным деревьям. С {\displaystyle S} С {\displaystyle S} С {\displaystyle S} С {\displaystyle {\mathcal {C}}} С = С . {\displaystyle \partial {C}=S.}

Внутренние операции

Все обновления леса выполняются последовательностью не более чем внутренних операций, последовательность которых вычисляется в дальнейшем времени. Может случиться, что во время обновления дерева кластер листьев может измениться на кластер путей и наоборот. Обновления верхнего дерева выполняются исключительно этими внутренними операциями. О ( бревно н ) {\displaystyle {\mathcal {O}}(\log n)} О ( бревно н ) {\displaystyle {\mathcal {O}}(\log n)}

Обновление выполняется путем вызова пользовательской функции, связанной с каждой внутренней операцией. я ( С ) {\displaystyle I({\mathcal {C}})}

  • Слияние Здесь и являются объединяемыми кластерами , он возвращает как родительский кластер и и с граничными вершинами в качестве граничных вершин Вычисляет с помощью и ( А , Б ) : {\displaystyle ({\mathcal {A}},{\mathcal {B}}){:}} А {\displaystyle {\mathcal {A}}} Б {\displaystyle {\mathcal {B}}} С {\displaystyle {\mathcal {C}}} А {\displaystyle {\mathcal {A}}} Б {\displaystyle {\mathcal {B}}} А Б . {\displaystyle {\mathcal {A}}\cup {\mathcal {B}}.} я ( С ) {\displaystyle I({\mathcal {C}})} я ( А ) {\displaystyle I({\mathcal {A}})} я ( Б ) . {\displaystyle I({\mathcal {B}}).}
  • Разделить Вот корневой кластер Он обновляет и использует , а затем удаляет кластер из . ( С ) : {\displaystyle ({\mathcal {C}}){:}} С {\displaystyle {\mathcal {C}}} А Б . {\displaystyle {\mathcal {A}}\cup {\mathcal {B}}.} я ( А ) {\displaystyle I({\mathcal {A}})} я ( Б ) {\displaystyle I({\mathcal {B}})} я ( С ) {\displaystyle I({\mathcal {C}})} С {\displaystyle {\mathcal {C}}} {\displaystyle \Re }

Split обычно реализуется с помощью метода Clean , который вызывает пользовательский метод для обновлений и с помощью обновлений и таким образом, что становится известно, что в его дочерних элементах нет необходимости в ожидающем обновлении. Затем отбрасывается без вызова пользовательских функций. Clean часто требуется для запросов без необходимости Split . Если Split не использует подпрограмму Clean, а Clean требуется, его эффект может быть достигнут с накладными расходами путем объединения Merge и Split . ( С ) {\displaystyle ({\mathcal {C}})} я ( А ) {\displaystyle I({\mathcal {A}})} я ( Б ) {\displaystyle I({\mathcal {B}})} я ( С ) {\displaystyle I({\mathcal {C}})} я ( С ) {\displaystyle I({\mathcal {C}})} С {\displaystyle {\mathcal {C}}}

Следующие две функции аналогичны двум предыдущим и используются для базовых кластеров.

  • Создать ( в , ж ) : {\displaystyle (v,w){:}} Создает кластер для ребра . Наборы вычисляются с нуля. С {\displaystyle {\mathcal {C}}} ( в , ж ) . {\displaystyle (v,w).} С = {\displaystyle \partial {C}=\partial } ( в , ж ) . {\displaystyle (v,w).} я ( С ) {\displaystyle I({\mathcal {C}})}
  • Eradicate ( С ) : {\displaystyle ({\mathcal {C}}){:}} — это краевой кластер. Для обработки вызывается определяемая пользователем функция , после чего кластер удаляется из верхнего дерева. С {\displaystyle {\mathcal {C}}} ( в , ж ) . {\displaystyle (v,w).} я ( С ) {\displaystyle I({\mathcal {C}})} С {\displaystyle {\mathcal {C}}}

Пользователь может определить операцию Choose ( С ) : {\displaystyle ({\mathcal {C}}){:}} , которая для корневого (нелистового) кластера выбирает один из его дочерних кластеров. Черный ящик верхнего дерева предоставляет процедуру Search ( С ) : {\displaystyle ({\mathcal {C}}){:}} , которая организует запросы Choose и реорганизацию верхнего дерева (используя внутренние операции) таким образом, что оно находит единственное ребро в пересечении всех выбранных кластеров. Иногда поиск должен быть ограничен путем. Для таких целей существует вариант нелокального поиска. Если в корневом кластере есть две внешние граничные вершины , ребро ищется только на пути . Достаточно выполнить следующую модификацию: если только один из дочерних узлов корневого кластера является кластером пути, он выбирается по умолчанию без вызова операции Choose . С {\displaystyle {\mathcal {C}}} π ( С ) {\displaystyle \pi ({\mathcal {C}})}

Поиск i-го ребра на более длинном пути от до может быть выполнен с помощью =Expose({v,w}) с последующим Search( ) с соответствующим Choose . Для реализации Choose мы используем глобальную переменную, представляющую , и глобальная переменная, представляющая Choose, выбирает кластер с , если длина не менее . Для поддержки операции длина должна поддерживаться в . в {\displaystyle v} ж {\displaystyle w} С {\displaystyle {\mathcal {C}}} С {\displaystyle {\mathcal {C}}} в {\displaystyle v} я . {\displaystyle я.} А {\displaystyle {\mathcal {A}}} в А {\displaystyle v\in \partial {A}} π ( А ) {\displaystyle \пи ({\mathcal {A}})} я {\displaystyle я} я {\displaystyle Я}

Аналогичную задачу можно сформулировать для графа с ребрами неединичной длины. В этом случае расстояние может относиться к ребру или вершине между двумя ребрами. Мы могли бы определить Choose таким образом, чтобы в последнем случае возвращалось ребро, ведущее к вершине. Можно было бы определить update, увеличивающее все длины ребер вдоль пути на константу. В таком сценарии эти обновления выполняются за постоянное время только в корневом кластере. Clean требуется для распространения отложенного обновления на потомков. Clean следует вызывать до вызова Choose . Для поддержания длины в в этом случае потребуется также поддерживать единичную длину в . я {\displaystyle Я} я {\displaystyle Я}

Поиск центра дерева, содержащего вершину, может быть выполнен путем поиска либо бицентрического ребра, либо ребра с центром в качестве одной из конечных точек. Ребро может быть найдено с помощью =Expose({v}), за которым следует Search( ) с соответствующим Choose . Выбор выбирает между потомками с потомком с более высоким maxdistance . Для поддержки операции максимальное расстояние в поддереве кластера от граничной вершины должно поддерживаться в . Это также требует поддержания длины пути кластера. в {\displaystyle v} С {\displaystyle {\mathcal {C}}} С {\displaystyle {\mathcal {C}}} А , {\displaystyle {\mathcal {A}},} Б {\displaystyle {\mathcal {B}}} а А Б {\displaystyle a\in \partial {A}\cap \partial {B}} ( а ) {\displaystyle (а)} я {\displaystyle Я}

Интересные результаты и приложения

Ряд интересных приложений, изначально реализованных другими методами, были легко реализованы с использованием интерфейса верхнего дерева. Некоторые из них включают

  • ([SLEATOR AND TARJAN 1983]). Мы можем поддерживать динамическую коллекцию взвешенных деревьев во времени для каждой ссылки и разреза, поддерживая запросы о максимальном весе ребра между любыми двумя вершинами во времени. О ( бревно н ) {\displaystyle {\mathcal {O}}(\log n)} О ( бревно н ) {\displaystyle O(\log n)}
    • Схема доказательства: Она включает в себя поддержание в каждом узле максимального веса (max_wt) на его кластерном пути, если это точечный кластер, то max_wt( ) инициализируется как Когда кластер является объединением двух кластеров, то это максимальное значение двух объединенных кластеров. Если нам нужно найти максимальный вес между и , то мы делаем Expose и сообщаем max_wt С {\displaystyle {\mathcal {C}}} . {\displaystyle -\infty .} в {\displaystyle v} ж {\displaystyle w} С = {\displaystyle {\mathcal {C}}=} ( в , ж ) , {\displaystyle (v,w),} ( С ) . {\displaystyle ({\mathcal {C}}).}
  • ([SLEATOR AND TARJAN 1983]). В сценарии вышеприведенного приложения мы также можем добавить общий вес ко всем ребрам на заданном пути · · · во времени. х {\displaystyle x} в {\displaystyle v} ж {\displaystyle w} О ( бревно н ) {\displaystyle {\mathcal {O}}(\log n)}
    • Схема доказательства: Мы вводим вес, называемый extra( ), который добавляется ко всем ребрам в , который поддерживается соответствующим образом; split( ) требует, чтобы для каждого дочернего пути мы установили max_wt(A) := max_wt( ) + extra( ) и extra( ) := extra( ) + extra( ). Для  := join( ) мы устанавливаем max_wt( ) := max {max_wt( ), max_wt( )} и extra( ) := 0. Наконец, чтобы найти максимальный вес на пути · · · мы устанавливаем  := Expose и возвращаем max_wt( ). С {\displaystyle {\mathcal {C}}} π ( С ) . {\displaystyle \pi ({\mathcal {C}}).} С {\displaystyle {\mathcal {C}}} А {\displaystyle {\mathcal {A}}} С , {\displaystyle {\mathcal {C}},} А {\displaystyle {\mathcal {A}}} С {\displaystyle {\mathcal {C}}} А {\displaystyle {\mathcal {A}}} А {\displaystyle {\mathcal {A}}} С {\displaystyle {\mathcal {C}}} С {\displaystyle {\mathcal {C}}} А , {\displaystyle {\mathcal {A}},} Б {\displaystyle {\mathcal {B}}} С {\displaystyle {\mathcal {C}}} А {\displaystyle {\mathcal {A}}} Б {\displaystyle {\mathcal {B}}} С {\displaystyle {\mathcal {C}}} в {\displaystyle v} ж , {\displaystyle w,} С {\displaystyle {\mathcal {C}}} ( в , ж ) {\displaystyle (v,w)} С {\displaystyle {\mathcal {C}}}
  • ([GOLDBERG ET AL. 1991]). Мы можем запросить максимальный вес в базовом дереве, содержащем заданную вершину во времени. в {\displaystyle v} О ( бревно н ) {\displaystyle {\mathcal {O}}(\log n)}
    • Схема доказательства: Для этого требуется сохранение дополнительной информации о максимальном весе некластерного пути-ребра в кластере при операциях слияния и разделения.
  • Расстояние между двумя вершинами можно найти за время как length(Expose ). в {\displaystyle v} ж {\displaystyle w} О ( бревно н ) {\displaystyle {\mathcal {O}}(\log n)} ( в , ж ) {\displaystyle (v,w)}
    • Схема доказательства: Мы будем поддерживать длину length( ) кластерного пути. Длина поддерживается как максимальный вес, за исключением того, что если создается с помощью join(Merge), length( ) является суммой длин, сохраненных с его потомками пути. С {\displaystyle {\mathcal {C}}} С {\displaystyle {\mathcal {C}}} С {\displaystyle {\mathcal {C}}}
  • Запросы относительно диаметра дерева и его последующего ухода требуют времени. О ( бревно н ) {\displaystyle {\mathcal {O}}(\log n)}
  • Центр и медиану можно сохранить с помощью операций «Связать» (Объединить) и «Разделить» (Разделить) и запросить с помощью нелокального поиска во времени. О ( бревно н ) {\displaystyle {\mathcal {O}}(\log n)}
  • Верхние деревья используются в современных алгоритмах для динамической двухреберной связности . В этой задаче, аналогично динамической связности , граф подвергается удалению и вставке ребер, а также запросам, спрашивающим, являются ли пара вершин двухреберно связанными или есть мост, разделяющий их. Холм, де Лихтенберг и Торуп [1] дают детерминированный алгоритм с амортизированным временем обновления и временем запроса. Последующая работа Холма, Ротенберга и Торупа улучшает его до амортизированного времени обновления , также используя верхние деревья [2] [3] О ( бревно 4 н ) {\displaystyle O(\log ^{4}n)} О ( бревно н / бревно бревно н ) {\displaystyle O(\log n/\log \log n)} О ( бревно 2 н бревно 2 бревно н ) {\displaystyle O(\log ^{2}n\log ^{2}\log n)}
  • Граф можно поддерживать, позволяя обновлять набор ребер и задавать запросы на связность вершины 2. Амортизированная сложность обновлений составляет . Запросы можно реализовать еще быстрее. Алгоритм нетривиальный, использует пространство. [4] О ( бревно 5 н ) {\displaystyle O(\log ^{5}n)} я ( С ) {\displaystyle I({\mathcal {C}})} Θ ( бревно 2 н ) {\displaystyle \Тета (\log ^{2}n)}
  • Верхние деревья можно использовать для сжатия деревьев способом, который никогда не будет намного хуже сжатия DAG , но может быть экспоненциально лучше. [5]

Выполнение

Деревья вершин были реализованы различными способами, некоторые из них включают реализацию с использованием многоуровневого разбиения (Алгоритмы деревьев вершин и динамических графов Якоба Хольма и Кристиана де Лихтенберга. Технический отчет) и даже с использованием деревьев Слейтора-Тарьяна (обычно с амортизированными временными ограничениями), деревьев топологии Фредериксона (с наихудшими временными ограничениями) (Альструп и др., Поддержание информации в полностью динамических деревьях с помощью деревьев вершин).

Амортизированные реализации более просты и имеют небольшие мультипликативные факторы временной сложности. Напротив, реализации в худшем случае позволяют ускорить запросы, отключая ненужные обновления информации во время запроса (реализуется методами сохранения ). После ответа на запрос используется исходное состояние верхнего дерева, а версия запроса отбрасывается.

Использование многоуровневого разбиения

Любое разбиение кластеров дерева может быть представлено Cluster Partition Tree CPT путем замены каждого кластера в дереве ребром. Если мы используем стратегию P для разбиения , то CPT будет CPT P Это делается рекурсивно, пока не останется только одно ребро. Т {\displaystyle {\mathcal {T}}} ( Т ) , {\displaystyle ({\mathcal {T}}),} Т {\displaystyle {\mathcal {T}}} Т {\displaystyle {\mathcal {T}}} Т . {\displaystyle {\mathcal {T}}.}

Мы бы заметили, что все узлы соответствующего верхнего дерева однозначно отображаются в рёбра этого многоуровневого разбиения. В многоуровневом разбиении могут быть некоторые рёбра, которые не соответствуют ни одному узлу в верхнем дереве, это рёбра, которые представляют только одного потомка на уровне ниже, т. е. простой кластер. Только рёбра, соответствующие составным кластерам, соответствуют узлам в верхнем дереве {\displaystyle \Re } . {\displaystyle \Re .}

Стратегия разбиения важна, когда мы разбиваем дерево на кластеры. Только тщательная стратегия гарантирует, что мы придем к многоуровневому разделу высоты (и, следовательно, к верхнему дереву). Т {\displaystyle {\mathcal {T}}} О ( бревно н ) {\displaystyle {\mathcal {O}}(\log n)}

  • Количество ребер на последующих уровнях должно уменьшаться на постоянный коэффициент.
  • Если более низкий уровень изменяется в результате обновления, то мы должны иметь возможность обновить тот, который находится непосредственно над ним, используя максимум постоянное число вставок и удалений.

Описанная выше стратегия разбиения обеспечивает поддержание главного дерева в актуальном состоянии. О ( бревно н ) {\displaystyle {\mathcal {O}}(\log n)}

Смотрите также

Ссылки

  • Стивен Альструп, Джейкоб Холм, Кристиан Де Лихтенберг и Миккель Торуп , Поддержание информации в полностью динамических деревьях с верхними деревьями , Транзакции ACM в алгоритмах (TALG), Vol. 1 (2005), 243–264, номер документа : 10.1145/1103963.1103966.
  • Стивен Альструп, Якоб Холм, Кристиан Де Лихтенберг и Миккель Торуп , Полилогарифмические детерминированные полностью динамические алгоритмы для связности, минимального остовного дерева, 2-ребер и бисвязности , Журнал ACM, т. 48, выпуск 4 (июль 2001 г.), 723–760, doi :10.1145/502090.502095
  • Дональд Кнут . Искусство программирования : основные алгоритмы , третье издание. Addison-Wesley, 1997. ISBN 0-201-89683-4 . Раздел 2.3: Деревья, стр. 308–423. 
  • Thomas H. Cormen , Charles E. Leiserson , Ronald L. Rivest и Clifford Stein . Introduction to Algorithms , Second Edition. MIT Press и McGraw-Hill, 2001. ISBN 0-262-03293-7 . Раздел 10.4: Представление корневых деревьев, стр. 214–217. Главы 12–14 (Двоичные деревья поиска, красно-черные деревья, расширение структур данных), стр. 253–320. 
  1. ^ Холм, Дж.; Де Лихтенберг, К.; Торуп, М. (2001). «Полилогарифмические детерминированные полностью динамические алгоритмы для связности, минимального остовного дерева, 2-ребра и бисвязности». Журнал ACM . 48 (4): 723. doi :10.1145/502090.502095. S2CID  7273552.
  2. ^ Торуп, Миккель (2000), «Почти оптимальная полностью динамическая связность графа», Труды тридцать второго ежегодного симпозиума {ACM} по теории вычислений
  3. ^ Холм, Якоб; Ротенберг, Ева; Торуп, Миккель (2018), «Динамический поиск мостов в амортизированном времени», Труды двадцать девятого ежегодного симпозиума {ACM-SIAM} по дискретным алгоритмам, {SODA} 2018 , doi : 10.1137/1.9781611975031.3 , S2CID  33964042 О ~ ( бревно 2 н ) {\displaystyle {\tilde {O}}(\log ^{2}n)}
  4. ^ Холм, Дж.; Де Лихтенберг, К.; Торуп, М. (2001). «Полилогарифмические детерминированные полностью динамические алгоритмы для связности, минимального остовного дерева, 2-ребра и бисвязности». Журнал ACM . 48 (4): 723. doi :10.1145/502090.502095. S2CID  7273552.
  5. ^ Билле, Филипп; Герц, Инге Ли; Ландау, Гад М.; Вайман, Орен (2015). «Сжатие дерева с верхними деревьями». Inf. Comput . 243 : 166–177 . arXiv : 1304.5702 . doi : 10.1016/j.ic.2014.12.012.
  • Поддержание информации в полностью динамических деревьях с верхними деревьями. Альструп и др.
  • Саморегулирующиеся верхние деревья. Тарьян и Вернек, Proc. 16th SoDA, 2005
Получено с "https://en.wikipedia.org/w/index.php?title=Top_tree&oldid=1227907085"