WikiDer > Верхнее дерево
А верхнее дерево это структура данных на основе двоичного дерева для некорневых динамических деревья который используется в основном для различных операций, связанных с путями. Это позволяет просто алгоритмы разделяй и властвуй. С тех пор он был расширен для динамического поддержания различных свойств дерево такие как диаметр, центр и медиана.
Верхнее дерево определен для лежащее в основе дерево и набор не более двух вершин, называемых Внешние граничные вершины
Глоссарий
Граничный узел
Видеть Граничная вершина
Граничная вершина
Вершиной связного поддерева называется Граничная вершина если он соединен ребром с вершиной вне поддерева.
Внешние граничные вершины
До пары вершин в верхнем дереве могут называться внешними граничными вершинами, их можно рассматривать как граничные вершины кластера, который представляет собой все верхнее дерево.
Кластер
А кластер является связным поддеревом с не более чем двумя Граничные вершины.Набор Граничные вершины данного кластера обозначается как С каждым кластером пользователь может связать некоторую метаинформацию и дать методы, чтобы поддерживать его при различных внутренние операции.
Кластер путей
Если содержит хотя бы одно ребро, тогда называется Кластер путей.
Кластер точек
Видеть Листовой кластер
Листовой кластер
Если не содержит ребра, т.е. есть только один Граничная вершина тогда называется Листовой кластер.
Пограничный кластер
Кластер, содержащий одно ребро, называется Пограничный кластер.
Кластер Leaf Edge
Лист в исходном кластере представлен кластером с единственной граничной вершиной и называется Кластер Leaf Edge.
Кластер контура пути
Краевые кластеры с двумя граничными узлами называются Кластер контура пути.
Внутренний узел
Узел в \ называется Внутренний узел из
Путь к кластеру
Путь между Граничные вершины из называется кластерный путь из и обозначается
Объединяемые кластеры
Два кластера и находятся Объединяемый если - одноэлементный набор (у них ровно один общий узел) и это кластер.
Вступление
Верхние деревья используются для поддержания Динамического леса (набора деревьев) под связать и вырезать операции.
Основная идея - поддерживать сбалансированный Двоичное дерево логарифмической высоты количества узлов в исходном дереве (т.е. в время) ; то верхнее дерево по сути представляет собой рекурсивное подразделение оригинального дерева в кластеры.
В общем дерево может иметь вес на краях.
Имеется взаимно однозначное соответствие с ребрами исходного дерева. и листовые узлы верхнего дерева и каждый внутренний узел представляет собой кластер, который формируется за счет объединения кластеров, являющихся его дочерними элементами.
Структура данных верхнего дерева может быть инициализирована в время.
Следовательно, верхнее дерево над ( ) - бинарное дерево такое, что
- Узлы кластеры ( );
- Листья края
- Соседние кластеры являются соседями в том смысле, что они пересекаются в одной вершине, а их родительский кластер является их объединением.
- Корень это дерево с набором не более двух внешних граничных вершин.
Дерево с единственной вершиной имеет пустую вершину, а дерево с одним ребром - это просто единственный узел.
Эти деревья свободно увеличиваемый предоставляя пользователю широкий спектр гибкости и производительности, не вдаваясь в подробности внутренней работы структуры данных, что также называется Черный ящик.
Динамические операции
Следующие три - это допустимые пользователем обновления леса.
- Ссылка (v, w): Где и вершины в разных деревьях 1 и 2. Он возвращает одно верхнее дерево, представляющее vш
- Вырезать (v, w): Убирает край из дерева с верхушкой дерева тем самым превратив его в два дерева v и ш и возвращение двух верхних деревьев v и ш.
- Выставить (S): Вызывается как подпрограмма для реализации большинства запросов в верхнем дереве. содержит не более 2 вершин. Он делает исходные внешние вершины нормальными вершинами и делает вершины из новые внешние граничные вершины верхнего дерева. Если непусто, возвращает новый корневой кластер с Выставить ({v, w}) не выполняется, если вершины принадлежат разным деревьям.
Внутренние операции
В Обновления леса все выполняются последовательностью не более Внутренние операции, последовательность которых вычисляется в дальнейшем время. Может случиться так, что во время обновления дерева листовой кластер может измениться на кластер пути и наоборот. Обновления верхнего дерева выполняются исключительно этими внутренними операциями.
В обновляется путем вызова пользовательской функции, связанной с каждой внутренней операцией.
- Объединить Здесь и находятся Объединяемые кластеры, он возвращается как родительский кластер и и с граничными вершинами как граничными вершинами Вычисляет с помощью и
- Расколоть Здесь это корневой кластер Он обновляет и с помощью и затем он удаляет кластер из .
Разделение обычно реализуется с помощью Чистый метод, который вызывает метод пользователя для обновления и с помощью и обновления так что известно, что для его дочерних элементов не требуется ожидающих обновлений. Чем отбрасывается без вызова пользовательских функций. Чистый часто требуется для запросов без необходимости Расколоть.Если Split не использует подпрограмму очистки, а требуется очистка, ее эффект может быть достигнут с накладными расходами путем объединения Объединить и Расколоть.
Следующие две функции аналогичны двум вышеупомянутым и используются для базовых кластеров.
- Создавать Создает кластер для края Наборы вычисляется с нуля.
- Искоренить это краевой кластер Пользовательская функция вызывается для обработки а чем кластер удаляется из верхнего дерева.
Нелокальный поиск
Пользователь может определить выбирать операция, которая для корневого (неконечного) кластера выбирает один из своих дочерних кластеров. Черный ящик верхнего дерева обеспечивает Поиск рутина, которая организует выбирать запросы и реорганизация верхнего дерева (с использованием внутренних операций) таким образом, чтобы оно находило единственное ребро на пересечении всех выбранных кластеров. Иногда поиск следует ограничивать путем. Для таких целей существует вариант нелокального поиска: при наличии двух внешних граничных вершин в корневом кластере , ребро ищется только на пути . Достаточно выполнить следующую модификацию: Если только один из дочерних корневых кластеров является кластером путей, он выбирается по умолчанию без вызова выбирать операция.
Примеры нелокального поиска
Нахождение i-го ребра на более длинном пути от к может быть сделано = Разоблачить ({v, w}) с последующим Поиск() с соответствующими выбирать. Для реализации выбирать мы используем глобальную переменную, представляющую и глобальная переменная, представляющая Выбрать выбирает кластер с iff длина по крайней мере . Для поддержки операции длина должна быть сохранена в .
Аналогичную задачу можно сформулировать для графа с ребрами неединичной длины. В этом случае расстояние может относиться к ребру или вершине между двумя ребрами. Мы могли бы определить Choose так, чтобы в последнем случае возвращалось ребро, ведущее к вершине. Можно определить обновление, увеличивающее длину всех ребер вдоль пути на константу. В таком сценарии эти обновления выполняются в постоянное время только в корневом кластере. Чистый требуется для распространения отложенного обновления среди детей. В Чистый должен быть вызван до Поиск вызывается. Чтобы сохранить длину в в этом случае потребуется поддерживать единичную длину в также.
Нахождение центра дерева, содержащего вершину может быть выполнено путем нахождения либо края бицентра, либо края с центром в качестве одной конечной точки. Край может быть найден = Разоблачить ({v}) с последующим Поиск() с соответствующими выбирать. Выбор выбирает между детьми с ребенок с более высоким максимальным расстоянием. Для поддержки операции максимальное расстояние в поддереве кластера от граничной вершины должно поддерживаться в . Это также требует сохранения длины пути кластера.
Интересные результаты и приложения
Ряд интересных приложений, изначально реализованных другими методами, был легко реализован с использованием интерфейса верхнего дерева. Некоторые из них включают
- ([SLEATOR AND TARJAN 1983]). Мы можем поддерживать динамический набор взвешенных деревьев в время на ссылку и вырез, поддержка запросов о максимальном весе ребра между любыми двумя вершинами в время.
- Схема доказательства: он включает в себя поддержание на каждом узле максимального веса (max_wt) на пути его кластера, если это точечный кластер, то max_wt () инициализируется как Когда кластер представляет собой объединение двух кластеров, это максимальное значение из двух объединенных кластеров. Если нам нужно найти максимальный вес между и тогда мы делаем Разоблачать и сообщить max_wt
- ([SLEATOR AND TARJAN 1983]). В сценарии вышеуказанного приложения мы также можем добавить общий вес ко всем ребрам на заданном пути · · · в время.
- Схема доказательства: мы вводим вес, называемый дополнительным () для добавления ко всем ребрам в Которая поддерживается надлежащим образом; расколоть() требует, чтобы для каждого дочернего пути из мы устанавливаем max_wt (A): = max_wt () + экстра () и дополнительные (): = дополнительные () + экстра (). За : = присоединиться ( ), устанавливаем max_wt (): = max {max_wt (), max_wt ()} и дополнительные (): = 0. Наконец, чтобы найти максимальный вес на пути · · · мы установили : = Разоблачить и вернем max_wt ().
- ([GOLDBERG ET AL. 1991]). Мы можем запросить максимальный вес в базовом дереве, содержащем данную вершину в время.
- Схема доказательства: для этого требуется поддерживать дополнительную информацию о максимальном весе края некластерного пути в кластере в рамках операций слияния и разделения.
- Расстояние между двумя вершинами и можно найти в время как длина (выставить).
- Схема доказательства: мы сохраним длину длины () кластерного пути. Длина сохраняется как максимальный вес, за исключением случаев, когда создается объединением (слияние), длина () - это сумма длин, хранящаяся в дочерних элементах пути.
- Запросы относительно диаметра дерева и последующего ухода за ним выполняются. время.
- Центр и Медиана можно поддерживать с помощью операций Связать (Объединить) и Вырезать (Разделить) и запрашивать путем нелокального поиска в время.
- Граф можно поддерживать, позволяя обновлять набор ребер и задавать запросы о связности ребер 2. Амортизированная сложность обновлений составляет . Запросы можно было реализовать еще быстрее. Алгоритм нетривиальный, использует пробел ([HOLM, LICHTENBERG, THORUP 2000]).
- Граф можно поддерживать, позволяя обновлять набор ребер и задавать запросы о связности вершин 2. Амортизированная сложность обновлений составляет . Запросы можно было реализовать еще быстрее. Алгоритм нетривиальный, использует пробел ([HOLM, LICHTENBERG, THORUP 2001]).
- Верхние деревья можно использовать для сжатия деревьев способом, который никогда не будет хуже, чем DAG сжатие, но может быть экспоненциально лучше.[1]
Выполнение
Верхние деревья были реализованы различными способами, некоторые из них включают реализацию с использованием Многоуровневое разделение (Топ-деревья и алгоритмы динамических графов Якоб Холм и Кристиан де Лихтенберг. Технический отчет), и даже с использованием Слеятор-Тарьян с-т деревья (обычно с амортизированными временными рамками), Деревья топологии Фредериксона (с ограничениями по времени наихудшего случая) (Алструп и др. Сохранение информации в полностью динамических деревьях с верхними деревьями).
Амортизированные реализации более просты и с небольшими мультипликативными множителями во временной сложности. Напротив, реализации наихудшего случая позволяют ускорить запросы, отключая ненужные обновления информации во время запроса (реализовано упорство техники). После ответа на запрос используется исходное состояние верхнего дерева, а версия запроса отбрасывается.
Использование многоуровневого разбиения
Любое разбиение кластеров дерева может быть представлен деревом разделения кластера CPT заменяя каждый кластер в дереве краем. Если мы используем стратегию P для разбиения тогда CPT будет CPTп Это делается рекурсивно, пока не останется только одно ребро.
Мы бы заметили, что все узлы соответствующего верхнего дерева однозначно отображаются на ребрах этого многоуровневого раздела. В многоуровневом разделе могут быть некоторые ребра, которые не соответствуют ни одному узлу в верхнем дереве, это ребра, которые представляют только один дочерний элемент на уровне ниже него, то есть простой кластер. Только ребра, которые соответствуют составным кластерам, соответствуют узлам в верхнем дереве.
Стратегия разделения важна, когда мы разбиваем дерево. в кластеры. Только тщательная стратегия гарантирует, что мы окажемся в высота многоуровневой перегородки (а значит и верхнего дерева).
- Количество ребер на последующих уровнях должно уменьшаться в постоянном размере.
- Если обновлением изменен более низкий уровень, тогда мы сможем обновить уровень, находящийся непосредственно над ним, используя не более постоянного количества вставок и удалений.
Вышеупомянутая стратегия разделения обеспечивает поддержание верхнего дерева в время.
Рекомендации
- Стивен Альструп, Якоб Холм, Кристиан Де Лихтенберг и Миккель Торуп, Ведение информации в полностью динамических деревьях с верхними деревьями, Транзакции ACM на алгоритмах (TALG), Vol. 1 (2005), 243–264, Дои:10.1145/1103963.1103966
- Стивен Альструп, Якоб Холм, Кристиан Де Лихтенберг и Миккель Торуп, Полилогарифмические детерминированные полностью динамические алгоритмы для подключения, минимального связующего дерева, 2-ребер и двусвязности, Журнал ACM, Vol. 48 Выпуск 4 (июль 2001 г.), 723–760, Дои:10.1145/502090.502095
- Дональд Кнут. Искусство программирования: Фундаментальные алгоритмы, Третье издание. Аддисон-Уэсли, 1997. ISBN 0-201-89683-4 . Раздел 2.3: Деревья, стр. 308–423.
- Томас Х. Кормен, Чарльз Э. Лейзерсон, Рональд Л. Ривест, и Клиффорд Штайн. Введение в алгоритмы, Второе издание. MIT Press и McGraw-Hill, 2001. ISBN 0-262-03293-7 . Раздел 10.4: Представление корневых деревьев, стр. 214–217. Главы 12–14 (Деревья двоичного поиска, красно-черные деревья, дополнительные структуры данных), стр. 253–320.
- ^ Сжатие деревьев с помощью верхних деревьев. БИЛЛ, ГЕРЦ, ЛАНДАУ, ВЕЙМАНН, 2013 arXiv: 1304.5702 [cs.DS]