1. /_Методички/Мультимедиа-системы. Архитектура, стандарты, алгоритмы.pdf 2. /_Методички/Организация ЭВМ 2006.doc 3. /_Методички/Основы сетевых технологий.djvu 4. /_Методички/Программирование/Биные Деревья Поиска/2_01БДПоиска.doc 5. /_Методички/Программирование/Биные Деревья Поиска/2_02БинДП.doc 6. /_Методички/Программирование/Биные Деревья Поиска/2_03СлучайБДП.doc 7. /_Методички/Программирование/Деревья Хаффмана/1.doc 8. /_Методички/Программирование/Деревья Хаффмана/1_1ДХафф.doc 9. /_Методички/Программирование/Деревья Хаффмана/1_2_3_ДХафф.doc 10. /_Методички/Программирование/Деревья Хаффмана/1_4_ДХафф.doc 11. /_Методички/Программирование/Деревья Хаффмана/1_5_ДХафф.doc 12. /_Методички/Программирование/Деревья Хаффмана/1_6_7_ДХафф.doc 13. /_Методички/Программирование/Деревья Хаффмана/1_8ДХафф.doc 14. /_Методички/Программирование/Деревья Хаффмана/1_9ДХафф.doc 15. /_Методички/Программирование/Деревья Хаффмана/ДерХафф full.doc 16. /_Методички/Программирование/Деревья Хаффмана/КарлКлара.doc 17. /_Методички/Программирование/Деревья Хаффмана/Кодируется текст АБРАКАДАБРА.doc 18. /_Методички/Программирование/Динамические СД/00Титул.rtf 19. /_Методички/Программирование/Динамические СД/0Введение.rtf 20. /_Методички/Программирование/Динамические СД/1Списки.doc 21. /_Методички/Программирование/Динамические СД/2СтекОчДек1.rtf 22. /_Методички/Программирование/Динамические СД/3Деревья.rtf 23. /_Методички/Программирование/Динамические СД/4прим_лит.rtf 24. /_Методички/Программирование/Динамические СД/5оглавление.doc 25. /_Методички/Программирование/Динамические СД/Динамическое программирование - Задача о перемножении матриц.doc 26. /_Методички/Программирование/Пособие по разработке корректных программ/00Титул1_3.doc 27. /_Методички/Программирование/Пособие по разработке корректных программ/01Введение.rtf 28. /_Методички/Программирование/Пособие по разработке корректных программ/1АлгоритмЕвклида.doc 29. /_Методички/Программирование/Пособие по разработке корректных программ/2ОсновыАналитВерифПрогРовно.doc 30. /_Методички/Программирование/Пособие по разработке корректных программ/3ИндуктФункции.doc 31. /_Методички/Программирование/Пособие по разработке корректных программ/4Массивы.doc 32. /_Методички/Программирование/Пособие по разработке корректных программ/5Поиск.doc 33. /_Методички/Программирование/Пособие по разработке корректных программ/ОглавФонар.doc 34. /_Методички/Программирование/Пособие по разработке корректных программ/СписЛит&УслОбознач.doc 35. /_Методички/Сетевые технологии.pdf 36. /_Методички/Средства моделирования вычислительных сетей.pdf 37. /_Методички/Управление вычислительными сетями.pdf | Учебное пособие Редактор А. В. Крейцер Издательство спбгэту «лэти» 1 97376, С. Петербург, ул. Проф. Попова, 5 2. Деревья поиска Идеально сбалансированные бинарные деревья 2 Случайные бинарные деревья поиска Абракадабра!, содержащий 12 символов, включая специальный символ ! Задача кодирования сообщений. Префиксные коды и деревья Пусть задан алфавит 1 Код Фано-Шеннона 1 Метод Хаффмана 1 Реализация алгоритмов кодирования 1 Доказательство оптимальности кода Хаффмана Лемма 1 1 Энтропийная оценка средней длины кода 1 Динамическое кодирование по Хаффману Абракадабра!, содержащий 12 символов, включая специальный символ ! Абракадабра!, содержащий 12 символов, включая специальный символ ! А. Ю. Алексеев с. А. Ивановский д. В. Куликов При обучении программированию особую трудность вызывает работа с динамическими структурами данных 2. стеки и очереди спецификация стека и очереди 3 Определения дерева, леса, бинарного дерева. Скобочное представление Примечания и библиографические указания Списки Задача о порядке перемножения матриц С. А. Ивановский разработкакорректныхпрограм м санкт-Петербург 2003 Программирования Разработка, доказательство корректности и анализ алгоритма 2. основы аналитической верификации программ основные правила аналитической верификации программ 3. индуктивные функции на последовательностях 4. корректность программ при работе с массивами 5. поиск в массиве линейный поиск Разработка, доказательство корректности Шень А. Программирование: теоремы и задачи: Учеб пособие
|
скачать doc 2.Деревья поиска
2.1.Идеально сбалансированные бинарные деревья
Как известно (см. [*], раздел 5), решении задачи поиска элемента в произвольном одномерном массиве из
n элементов требует в худшем случае
n сравнений, а в среднем
n/2 сравнений (при равномерном распределении предъявляемых для поиска элементов). В упорядоченном массиве задача поиска решается алгоритмом
бинарного поиска не более чем за

сравнений, и это оптимальный результат для алгоритмов, основанных на сравнениях (см. [*], раздел 5). По количеству сравнений бинарный поиск является эталоном для решения задач поиска. Однако если кроме поиска требуется производить и другие операции с данными, например, такие как вставка или удаление элемента, то массив не является подходящей структурой данных, поскольку выполнение этих операций требует количества перемещений элементов массива в среднем пропорционального его размеру. Говорят, что эти операции являются
массовыми.
Использование деревьев для организации данных, с которыми требуется выполнять операции поиска, вставки и удаления, оказывается более предпочтительным.
Далее будем предполагать, что каждый элемент данных
d содержит поле ключа
d.
key (или в других обозначениях
key(
d) или
k(
d)), который используется для сравнений в ходе операций поиска.
Возможно, не всякие (по структуре) деревья будут одинаково эффективными для поиска. Если вспомнить деревья решений, используемые при анализе алгоритма бинарного поиска [*], то естественно ожидать, что лучшие результаты будут получаться в случае более ровных деревьев, например, деревьев, имеющих минимальную высоту при заданном количестве узлов.
Рассмотрим так называемые
идеально сбалансированные деревья. Идеально сбалансированным назовем такое бинарное дерево
T , что для каждого его узла
x справедливо соотношение
nL(
x)
nR(
x) 1, где
nL(
x) количество узлов в левом поддереве узла
x, а
nR(
x) количество узлов в правом поддереве
узла
x. Примеры некоторых идеально сбалансированных деревьев даны на рисунке.
Л

егко установить, что в идеально сбалансированном дереве число узлов
n и высота дерева
h связаны соотношением

или в другой форме

(Здесь и далее высота дерева определена так, что при
n = 0 имеем
h = 0, а при
n = 1 имеем
h = 1).
Рассмотрим алгоритм построения идеально сбалансированного дерева по последовательности данных
a1,
a2, …,
an (например, находящейся в файле
f_
input). Идея этого рекурсивного алгоритма ясна из следующего рисунка (здесь
nL =
n div 2 и
nR =
n –
nL – 1, т. е.
n =
nL +
nR +1)

Считаем, что тип данных
BTree, представляющий бинарное дерево, определен как
type BTree =
Node;
Node =
record Info:
Elem;
LSub,
RSub:
BTreeend {
Node}
Кроме того, базовые функции этого типа, например,
Null,
Create,
Root,
Left,
Right,
ConsBT,
MakeRoot определены так же, как в [**], раздел 3.
Тогда алгоритм, реализованный в виде рекурсивной функции, есть
function Tree (
n:
Nat0):
BTree;
var nL,
nR:
Nat0;
b1,
b2:
BTree;
x:
Elem;
begin if n = 0
then Tree :=
nil elsebegin nL :=
n div 2;
nR :=
n –
nL – 1;
b1 :=
Tree (
nL);
Read (
f_
input,
x);
b2 :=
Tree (
nR);
Tree :=
ConsBT (
x,
b1,
b2)
endend {
Tree}
Здесь
ConsBT (
x,
b1,
b2) функция-конструктор, строящая новое дерево из корня
x и левого
b1 и правого
b2 поддеревьев.
Р

ассмотрим примеры работы этого алгоритма. Пусть во входном файле находится последовательность
a,
b,
c,
d,
e,
f,
g,
h,
i, а стартовый вызов функции
Tree (
n) производится так:
Reset(
f_
input);
b :=
Tree (
n). На рисунке представлены деревья, построенные с помощью функции
Tree (
n) при значениях
n = 1, 2, 3, 4, 5, 6, 7, 8, 9.
Отметим, что наш алгоритм строит такие идеально сбалансированные деревья, что
nL(
x)
nR(
x) = 0 или 1, т. е. при
nL(
x) ≠
nR(
x) именно левое поддерево содержит на один узел больше. При этом структура дерева определяется только значением параметра
n, а содержимое узлов зависит от расположения элементов во входной последовательности. В предыдущем примере из-за того, что входная последовательность упорядочена, все построенные деревья обладают интересным свойством: при обходе этих деревьев «слева направо», т. е. при симметричном или ЛКП обходе (см. [**] раздел 3), порождается исходная
упорядоченная последовательность. Тот факт, что получается
исходная последовательность, не удивителен, поскольку алгоритм построения дерева следует той же ЛКП схеме – сначала строится левое поддерево, затем определяется корень дерева, а затем уже строится правое поддерево, после чего происходит сборка результирующего дерева.
Полезно в качестве упражнения рассмотреть алгоритмы построения идеально сбалансированных деревьев, отличающиеся порядком чередования рекурсивных вызовов и вызова процедуры чтения из файла, т. е. рассмотреть следующие варианты:
Вариант с КЛП схемой
| Вариант с ЛПК схемой
|
begin nL := n div 2; nR := n – nL – 1;
Read (f_input, x);
b1 := Tree (nL);
b2 := Tree (nR);
Tree := ConsBT (x, b1, b2)
end
| begin nL := n div 2; nR := n – nL – 1;
b1 := Tree (nL);
b2 := Tree (nR);
Read (f_input, x);
Tree := ConsBT (x, b1, b2)
end
|
Если бы входная последовательность не была упорядочена, то построенное нашей функцией
Tree дерево не обладало бы отмеченным свойством упорядоченности.
Деревья, в результате ЛКП обхода которых получается упорядоченная последовательность узлов, называются деревьями
поиска и будут подробно рассмотрены далее.