Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В информатике , оптимальное бинарное дерево поиска (Оптимальное БСТ) , иногда называемый вес сбалансирован бинарное дерево , [1] является бинарное дерево поиска , который обеспечивает наименьшее возможное время поиска (или ожидаемое время поиска ) для данной последовательности доступов (или вероятности доступа). Оптимальные BST обычно делятся на два типа: статические и динамические.

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

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

Статическая оптимальность [ править ]

Определение [ править ]

В статической задаче оптимальности , как определено Кнут , [2] задано множество п заказал элементы и набор вероятностей. Мы будем обозначать элементы через и вероятности через и через . вероятность того, что элемент будет выполнен поиском . Ибо , - это вероятность того, что поиск будет выполнен для элемента между и , - это вероятность того, что поиск будет выполнен для элемента, строго меньшего, чем , и - это вероятность того, что поиск будет выполнен для элемента, строго превышающего . Эти вероятности охватывают все возможные поиски и поэтому в сумме составляют один.

Проблема статической оптимальности - это задача оптимизации поиска двоичного дерева поиска, которое минимизирует ожидаемое время поиска с учетом вероятностей. Поскольку количество возможных деревьев в наборе из n элементов равно , [2], что экспоненциально от n , поиск методом перебора обычно не является допустимым решением.

Алгоритм динамического программирования Кнута [ править ]

В 1971 году Кнут опубликовал относительно простой алгоритм динамического программирования , способный построить статически оптимальное дерево всего за O ( n 2 ) времени. [2] Основное понимание Кнута состояло в том, что проблема статической оптимальности демонстрирует оптимальную подструктуру ; то есть, если определенное дерево является статически оптимальным для данного распределения вероятностей, то его левое и правое поддеревья также должны быть статически оптимальными для соответствующих подмножеств распределения.

Чтобы убедиться в этом, рассмотрим то, что Кнут называет «взвешенной длиной пути» дерева. Взвешенная длина пути дерева из n элементов представляет собой сумму длин всех возможных путей поиска, взвешенных по их соответствующим вероятностям. Дерево с минимальной взвешенной длиной пути по определению является статически оптимальным.

Но у взвешенных длин пути есть интересное свойство. Пусть E будет взвешенной длиной пути двоичного дерева, E L будет взвешенной длиной пути его левого поддерева, а E R будет взвешенной длиной пути его правого поддерева. Также пусть W будет суммой всех вероятностей в дереве. Обратите внимание, когда любое поддерево присоединяется к корню, глубина каждого из его элементов (и, следовательно, каждого из его путей поиска) увеличивается на единицу. Также обратите внимание, что глубина самого корня равна единице. Это означает, что разница во взвешенной длине пути между деревом и двумя его поддеревьями является в точности суммой каждой отдельной вероятности в дереве, что приводит к следующему повторению:

Это повторение приводит к естественному решению динамического программирования. Пусть будет взвешенной длиной пути статически оптимального дерева поиска для всех значений между a i и a j , пусть будет общим весом этого дерева и пусть будет индексом его корня. Алгоритм можно построить по следующим формулам:

Наивная реализация этого алгоритма фактически занимает O ( n 3 ) времени, но статья Кнута включает некоторые дополнительные наблюдения, которые можно использовать для создания модифицированного алгоритма, занимающего всего O ( n 2 ) времени.

Алгоритм аппроксимации Мельхорна [ править ]

Хотя время O ( n 2 ), затрачиваемое алгоритмом Кнута, значительно лучше экспоненциального времени, необходимого для поиска методом грубой силы, оно все же слишком медленно, чтобы быть практичным, когда количество элементов в дереве очень велико.

В 1975 году Курт Мельхорн опубликовал статью, доказывающую, что гораздо более простой алгоритм может быть использован для точной аппроксимации статически оптимального дерева всего за время. [3] В этом алгоритме корень дерева выбирается так, чтобы максимально сбалансировать общий вес (по вероятности) левого и правого поддеревьев. Затем эта стратегия рекурсивно применяется к каждому поддереву.

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

где H - энтропия распределения вероятностей. Поскольку никакое оптимальное двоичное дерево поиска не может работать лучше, чем длина взвешенного пути

это приближение очень близко. [3]

Алгоритмы Ху – Такера и Гарсиа – Вакса [ править ]

В особом случае, когда все значения равны нулю, оптимальное дерево может быть найдено вовремя . Впервые это было доказано Т.С. Ху и Аланом Такером в статье, опубликованной ими в 1971 году. Более позднее упрощение Гарсиа и Вахса, алгоритм Гарсиа – Вакса , выполняет те же сравнения в том же порядке. Алгоритм работает с использованием жадного алгоритма для построения дерева с оптимальной высотой для каждого листа, но не в порядке, а затем построения другого двоичного дерева поиска с такой же высотой. [4]

Динамическая оптимальность [ править ]

Нерешенная проблема в информатике :

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

(больше нерешенных проблем в информатике)

Определение [ править ]

Существует несколько различных определений динамической оптимальности, все из которых фактически эквивалентны с точностью до постоянного коэффициента с точки зрения времени работы. [5] Проблема была впервые представлена ​​неявно Слеятором и Тарьяном в их статье о растянутых деревьях , [6] но Демейн и др. дать очень хорошее формальное заявление об этом. [5]

В задаче динамической оптимальности нам дана последовательность обращений x 1 , ..., x m по ключам 1, ..., n. Для каждого доступа нам дается указатель на корень нашего BST и мы можем использовать указатель для выполнения любой из следующих операций:

  1. Переместите указатель к левому дочернему элементу текущего узла.
  2. Переместите указатель к правому дочернему элементу текущего узла.
  3. Переместите указатель на родительский элемент текущего узла.
  4. Выполните однократный поворот текущего узла и его родителя.

(Это наличие четвертой операции, которая перестраивает дерево во время доступа, что делает эту проблему динамической оптимальности.)

Для каждого доступа наш алгоритм BST может выполнять любую последовательность вышеуказанных операций до тех пор, пока указатель в конечном итоге окажется на узле, содержащем целевое значение x i . Время, необходимое данному динамическому алгоритму BST для выполнения последовательности обращений, эквивалентно общему количеству таких операций, выполненных в течение этой последовательности. Для любой последовательности обращений к любому набору элементов существует некоторое минимальное общее количество операций, необходимых для выполнения этих обращений. Хотелось бы приблизиться к этому минимуму.

Хотя невозможно реализовать этот « алгоритм Бога » без предварительного знания того, какой будет последовательность доступа, мы можем определить OPT (X) как количество операций, которые он будет выполнять для последовательности доступа X, и мы можем сказать, что алгоритм является динамически оптимальным, если для любого X он выполняет X за время O (OPT (X)) (то есть имеет постоянный коэффициент конкуренции ). [5]

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

Раскрывающиеся деревья [ править ]

Расширенное дерево - это форма бинарного дерева поиска, изобретенного в 1985 году Дэниелом Слейтором и Робертом Тарьяном, на котором стандартные операции дерева поиска выполняются с амортизированным временем. [7] Предполагается, что он динамически оптимален в нужном смысле. То есть предполагается, что расширяемое дерево выполняет любую достаточно длинную последовательность доступа X за время O (OPT (X)). [6]

Деревья танго [ править ]

Дерева танго представляет собой структуру данных , предложенный в 2004 году Эрик Демейн и другие , которые было доказано , чтобы выполнить любую достаточно длинную последовательность-доступа к X во времени . Хотя это не является оптимальным с динамической точки зрения, коэффициент конкурентоспособности все еще очень мал при разумных значениях n. [5]

Другие результаты [ править ]

В 2013 году Джон Иаконо опубликовал статью, в которой используется геометрия двоичных деревьев поиска для предоставления алгоритма, который является динамически оптимальным, если любой алгоритм двоичного дерева поиска является динамически оптимальным. [8] Узлы интерпретируются как точки в двух измерениях, и оптимальная последовательность доступа - это наименьшее произвольно удовлетворяемое надмножество этих точек. В отличие от растянутых деревьев и деревьев танго, структура данных Iacono не известна как реализуемая за постоянное время на шаг последовательности доступа, поэтому даже если она динамически оптимальна, она все равно может быть медленнее, чем другие структуры данных дерева поиска, на непостоянный коэффициент.

Перемежать нижняя граница приведен асимптотический нижняя граница динамического оптимальности.

См. Также [ править ]

  • Деревья
  • Splay tree
  • Танго дерево
  • Геометрия бинарных деревьев поиска
  • Чередовать нижнюю границу

Заметки [ править ]

  1. ^ Трембле, Жан-Поль; Честон, Грант А. (2001). Структуры данных и разработка программного обеспечения в объектно-ориентированной области . Издание Eiffel / Prentice Hall. ISBN 978-0-13-787946-5.
  2. ^ Б с Кнут, Дональда Е. (1971), "Оптимальный двоичный поиск деревья", Acta Informatica , 1 (1): 14-25, DOI : 10.1007 / BF00264289 , S2CID 62777263 
  3. ^ Б Mehlhorn, Курт (1975), "Почти оптимальные бинарные деревья поиска" , Acta , обработка данных , 5 (4): 287-295, DOI : 10.1007 / BF00264563 , S2CID 17188103 
  4. ^ Кнут, Дональд Э. (1998), "Алгоритм G (алгоритм Гарсиа-Вакса для оптимальных двоичных деревьев)", Искусство компьютерного программирования, Vol. 3: Сортировка и поиск (2-е изд.), Аддисон – Уэсли, стр. 451–453.. См. Также «История и библиография», стр. 453–454.
  5. ^ a b c d Demaine, Erik D .; Хармон, Дион; Яконо, Джон; Патрашка Михай (2004), Dynamic оптимальность-почти (PDF) . С. 484-490, CiteSeerX 10.1.1.99.4964 , DOI : 10,1109 / FOCS.2004.23 , ISBN   978-0-7695-2228-9
  6. ^ a b Слеатор, Дэниел; Тарьян, Роберт (1985), "саморегулирующийся бинарные деревья поиска", Журнал ACM , 32 (3): 652-686, DOI : 10,1145 / 3828,3835 , S2CID 1165848 
  7. ^ Кормен, Томас Х .; Leiserson, Charles E .; Ривест, Рональд; Стейн, Клиффорд (2009). Введение в алгоритмы (PDF) (Третье изд.). MIT Press. п. 503. ISBN  978-0-262-03384-8. Проверено 31 октября 2017 года .
  8. ^ Яконо, Джон (2013), «В погоне за гипотезой динамической оптимальности», arXiv : 1306.0207 [ cs.DS ]