logo search
КЛ

Алгоритм

1. Дано: неотрицательные веса. Для i = 0, 1, 2, … , n полагают вес дерева совпадает с весом соответствующего листа, стоимость равна нулю, корень совпадает с листом:

2. Для выполнить шаг 3.

3. Для i = 0,1,2, …,nl выполнить шаг 4.

4. Положить Пусть т – значение параметра , для которого сумма минимальна.

Положить

Вычислив с помощью приведенного выше алгоритма, мы можем построить дерево , используя следующую процедуру:

1. корень дерева . Если , то ak имеет в качестве левого узла , а в качестве правого .

2. Рассмотрим внутреннюю вершину ат . Если ат = , то ат имеет в качестве левого узла, а в качестве правого.

Согласно принципу оптимальности, чтобы выбрать корень оптимального дерева, нужно вычислить для каждого узла с весом pi стоимость в предположении, что ai является корнем дерева Т . Это требует знания оптимальных правого и левого поддеревьев ak .

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

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

Пример. Пусть имеются четыре упорядоченных элемента с весами р1 = 2, р2 =1, р3 =3, р4 =1; q0 =1, q1 =2, q2 =3, q3 =2, q4 =1. Построить оптимальное дерево бинарного поиска.

□ Воспользуемся алгоритмом Гильберта – Мура .

1. Для полагаем

2. и выполним шаг 3.

3. Так как i = 0, 1, 2, …, nl , то i = 0, 1, 2, 3. Выполним шаг 4.

4. Вычисляем веса деревьев по формуле:

,

где .

Тогда, учитывая l , получим

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

Вычисляем стоимость деревьев , минимизируя сумму

и каждый раз оптимально выбираем корень.

Используя указанную выше процедуру построения дерева, построим это дерево:

Корнем дерева является . Для корня левым узлом будет , а правым – . Для корня левым узлом будет , а правым – , т.е лист b2 . Для корня левым листом будет , а правым – . Для корня а4 левым листом будет , а правым – . ■