NetNado
  Найти на сайте:

Учащимся

Учителям



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)), который используется для сравнений в ходе операций поиска.

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

Рассмотрим так называемые идеально сбалансированные деревья. Идеально сбалансированным назовем такое бинарное дерево , что для каждого его узла 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: BTree

end {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 else

begin nL := n div 2; nR := n nL – 1;

b1 := Tree (nL);

Read (f_inputx);

b2 := Tree (nR);

Tree := ConsBT (x, b1, b2)

end

end {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_inputx);

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_inputx);

Tree := ConsBT (x, b1, b2)

end


Если бы входная последовательность не была упорядочена, то построенное нашей функцией Tree дерево не обладало бы отмеченным свойством упорядоченности.

Деревья, в результате ЛКП обхода которых получается упорядоченная последовательность узлов, называются деревьями поиска и будут подробно рассмотрены далее.