Двоичное дерево поиска (BST) — это дерево, в котором значения ключей хранятся во внутренних узлах. Внешние узлы являются нулевыми узлами. Ключи упорядочены лексикографически, то есть для каждого внутреннего узла все ключи в левом поддереве меньше, чем ключи в узле, а все ключи в правом поддереве больше.
Когда мы знаем частоту поиска каждого из ключей, довольно легко вычислить ожидаемую стоимость доступа к каждому узлу в дереве. Оптимальным бинарным деревом поиска является BST, у которого минимальная ожидаемая стоимость определения местоположения каждого узла.
Время поиска элемента в BST равно O (n) , тогда как в сбалансированном BST время поиска равно O (log n) . Опять же, время поиска можно улучшить в дереве бинарного поиска с оптимальной стоимостью, размещая наиболее часто используемые данные в корне и ближе к корневому элементу, а наименее часто используемые данные — рядом с листьями и листьями.
Здесь представлен алгоритм оптимального бинарного дерева поиска. Сначала мы строим BST из набора предоставленных n различных ключей <k 1 , k 2 , k 3 , … k n > . Здесь мы предполагаем, что вероятность доступа к ключу K i равна p i . Добавлены некоторые фиктивные ключи ( d 0 , d 1 , d 2 , … d n ), поскольку могут быть выполнены некоторые поиски для значений, которых нет в наборе ключей K. Мы предполагаем, что для каждого фиктивного ключа d i вероятность доступа равна q i .
Optimal-Binary-Search-Tree(p, q, n) e[1…n + 1, 0…n], w[1…n + 1, 0…n], root[1…n + 1, 0…n] for i = 1 to n + 1 do e[i, i - 1] := q i - 1 w[i, i - 1] := q i - 1 for l = 1 to n do for i = 1 to n – l + 1 do j = i + l – 1 e[i, j] := ∞ w[i, i] := w[i, i -1] + p j + q j for r = i to j do t := e[i, r - 1] + e[r + 1, j] + w[i, j] if t < e[i, j] e[i, j] := t root[i, j] := r return e and root
Анализ
Алгоритм требует времени O (n 3 ) , поскольку используются три вложенных цикла for . Каждый из этих циклов принимает не более n значений.
пример
Учитывая следующее дерево, стоимость составляет 2,80, хотя это не оптимальный результат.
Узел | глубина | Вероятность | Вклад |
---|---|---|---|
к 1 | 1 | 0,15 | 0,30 |
к 2 | 0 | 0,10 | 0,10 |
к 3 | 2 | 0,05 | 0,15 |
к 4 | 1 | 0,10 | 0,20 |
к 5 | 2 | 0,20 | 0,60 |
д 0 | 2 | 0,05 | 0,15 |
д 1 | 2 | 0,10 | 0,30 |
д 2 | 3 | 0,05 | 0,20 |
д 3 | 3 | 0,05 | 0,20 |
д 4 | 3 | 0,05 | 0,20 |
д 5 | 3 | 0,10 | 0,40 |
Всего | 2,80 |
Чтобы получить оптимальное решение, используя алгоритм, обсуждаемый в этой главе, создаются следующие таблицы.
В следующих таблицах индекс столбца равен i, а индекс строки равен j .
е | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
5 | 2,75 | 2,00 | 1,30 | 0,90 | 0,50 | 0,10 |
4 | 1,75 | 1,20 | 0,60 | 0,30 | 0,05 | |
3 | 1,25 | 0,70 | 0,25 | 0,05 | ||
2 | 0,90 | 0,40 | 0,05 | |||
1 | 0,45 | 0,10 | ||||
0 | 0,05 |
вес | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
5 | 1,00 | 0,80 | 0,60 | 0,50 | 0,35 | 0,10 |
4 | 0,70 | 0,50 | 0,30 | 0,20 | 0,05 | |
3 | 0,55 | 0,35 | 0,15 | 0,05 | ||
2 | 0,45 | 0,25 | 0,05 | |||
1 | 0,30 | 0,10 | ||||
0 | 0,05 |
корень | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
5 | 2 | 4 | 5 | 5 | 5 |
4 | 2 | 2 | 4 | 4 | |
3 | 2 | 2 | 3 | ||
2 | 1 | 2 | |||
1 | 1 |
Из этих таблиц можно сформировать оптимальное дерево.