Учебники

DAA — Деревья бинарного поиска с оптимальной стоимостью

Двоичное дерево поиска (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

Из этих таблиц можно сформировать оптимальное дерево.