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 дерево не обладало бы отмеченным свойством упорядоченности.
Деревья, в результате ЛКП обхода которых получается упорядоченная последовательность узлов, называются деревьями 
поиска и будут подробно рассмотрены далее.