- •16. Обход n-арного дерева. Алгоритмы обхода n-арного дерева.
- •17.Бинарные деревья – основные определения, свойства и теоремы.
- •18,19.Не рекурсивные алгоритмы обхода бинарного дерева.
- •20.Поиск в упорядоченных таблицах. Последовательный поиск в массиве.
- •21.Поиск в упорядоченных таблицах. Двоичный поиск в массиве. Фибоначчиев поиск. Интерполяционный поиск.
- •22. Поиск в линейном списке.
- •23.Двоичное дерево поиска. Свойства. Основные операции.
- •Iterative_Tree_Search(t,k).
- •24. Добавление элемента в двоичном дереве поиска.
- •25. Удаление элемента в двоичном дереве поиска.
- •26. Абстрактная таблица. Основные операции. Способ реализации.
- •27. Авл – деревья. Свойства. Вращение. Высота авл-дерева (теорема) Определение и свойства авл-дерева
- •Авл - дерево
- •Повороты при балансировке
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •29. Удаление вершины в авл – дереве.
- •Алгоритм на псевдокоде
- •30. Красно – черные деревья. Свойства. Вращение. Высота красно – черного дерева.
- •Повороты
- •Операции поворота в бинарном дереве поиска
- •31. Добавление вершины в красно – черном дереве.
- •32. Удаление вершины в красно – черном дереве.
- •33. 2-3 Деревья. Основные свойства. Высота 2-3 дерева.
- •34 Обход 2-3 дерева.
- •35 Добавление элемента в 2 – 3 дерево.
- •36 Удаление элемента в 2 – 3 дереве.
- •37 2 – 3 – 4 Деревья. Основные свойства. Высота 2 – 3 – 4 дерева.
- •38 Добавление элемента в 2 – 3 – 4 дерево.
- •39. Стратегии внутренней сортировки.
- •40. Турнирная сортировка.
- •41. Пирамидальная сортировка.
- •42. Вставка с убывающим шагом.
- •43. Быстрая сортировка.
- •44. Быстрая двоичная сортировка.
- •45. Цифровая сортировка.
- •46. Карманная (блочная) сортировка.
- •47. Сортировка подсчетом
- •48. Сортировка слиянием. Рекурсивный алгоритм
- •49. Нижняя граница вычислительной сложности алгоритмов сортировки.
- •50. Поиск в глубину в графе. Рекурсивный алгоритм.
- •51. Поиск в ширину в графе. Не рекурсивный алгоритм.
- •52. Топологическая сортировка. Алгоритм топологической сортировки.
- •58. Стягивающие деревья. Нахождение стягивающего дерева методом поиска в ширину
- •59. Стягивающие деревья. Нахождение стягивающего дерева методом поиска в глубину.
- •60.Минимальные покрывающие деревья. Алгоритм Прима
- •61.Минимальные покрывающие деревья. Алгоритм Крускала.
- •62. Нахождение кратчайших путей в графе. Алгоритм Форда – Беллмана
- •63 Поиск кратчайших путей в графе. Алгоритм Дэйкстры.
- •64 Пути в бесконтурном графе.
- •65 Алгоритм Флойда поиска кратчайших путей между всеми парами вершин
- •66. Открытое хеширование.
- •67. Хеш-функции (ключи как натуральные числа, деление с остатком, умножение).
- •68. Закрытое хеширование. (Линейная последовательность проб. Квадратичная последовательность проб. Двойное хеширование).
- •69 Алгоритм Кнута-Морриса-Пратта.
- •70 Поиск подстрок. Алгоритм Бойера-Мура.
- •71. Поиск подстрок. Алгоритм Рабина-Карпа
- •72 Равномерный и неравномерный код. Префиксное кодирование.
- •73. Алгоритм Шеннона – Фано
- •74. Сжатие информации. Метод Хаффмана.
- •75. Исчерпывающий перебор. Задачи коммивояжера. Задача о назначениях.
- •77. Метод ветвей и границ. Задача о назначениях. Задача о рюкзаке. Задача коммивояжера.
- •Постановка задачи коммивояжера
- •Алгоритм решения задачи коммивояжера Жадный алгоритм
- •Полный перебор
- •78. Динамическое программирование. Восходящее и нисходящее динамическое программирование
- •79.Задача определения наиболее длинной общей подпоследовательности.
- •80. Перемножение последовательности матриц.
18,19.Не рекурсивные алгоритмы обхода бинарного дерева.
20.Поиск в упорядоченных таблицах. Последовательный поиск в массиве.
21.Поиск в упорядоченных таблицах. Двоичный поиск в массиве. Фибоначчиев поиск. Интерполяционный поиск.
Очень часто приходится решать следующую задачу: найти элемент с нужным значением ключа. Эту задачу приходится решать с использованием массивов, списков, деревьев. Эта задача решается по-разному в случае неупорядоченных или упорядоченных по возрастанию ключей элементов. В последнем случае можно не просматривать все элементы, а доходить только до элемента с ключом большим, чем требуемый.
Существует два альтернативных способа поиска: последовательный и двоичный. В последовательном списке может применяться только последовательный поиск в порядке следования указателей. В двоичном дереве естественным является двоичный поиск. В массиве может быть организован как тот, так и другой алгоритм.
Двоичный поиск:
Применяется для упорядоченных массивов. При двоичном поиске используется метод деления пополам. Поставим задачу так: найти наименьший индекс (указатель) компоненты списка со значением ключа, равным Х.
Алгоритм:
VAR A: ARRAY[1..N] OF INTEGER;
X: INTEGER;
VAR I: INTEGER;
BEGIN
I := 1; J := N;
REPEAT
K := (I + J) DIV 2;
IF X > A[K] THEN I := K + 1 ELSE J := K - 1
UNTIL (A[K] = X) OR (I > J)
END.
Число просмотров m = log2N.
При N = 100: последовательный поиск выполнится за 50 просмотров (m = 50), двоичный за 6,62 (m = 6,62)
22. Поиск в линейном списке.
Как и в файле, поиск ведется строго последовательно. Он заканчивается либо когда элемент найден, либо когда достигнут конец списка.
Алгоритм
B←true; P←BeginList
While (P≠nil) and B do
If P^.key>=x then B←false
Else P←P^.next
End while
If (B=true) then return nil
Else return P
23.Двоичное дерево поиска. Свойства. Основные операции.
Двоичное дерево поиска – это двоичное дерево, с каждым из внутренних узлов которого, связан ключ, удовлетворяющий условиям:
Все ключи в левом поддереве меньше родительского узла меньше родительского
Все ключи в правом поддереве больше родительского
Для поиска среди N элементов может потребоваться не более log2N сравнений. Если дерево идеально сбалансировано.
В этом преимущество дерева перед линейным списком, в котором для поиска может потребоваться N сравнений
Основные операции:
Включить узел в бинарное дерево поиска
Удалить узел
Выполнить поиск данных
Выполнить обход
Определить, пусто ли дерево
Создать
Уничтожить
Поиск Эл-та в 2-ном дереве:
Tree_Search(T,K).
1.i f (t=nil) or (k=T^.key) then return T
2.i f k<T^.key then return Tree_Search(T^.left,k)
3. else return Tree_Search(T^.right,k)
Iterative_Tree_Search(t,k).
1.while (T<>nil) and (k<>T^.key) do
2.if k<T^.key then TT^.left
3.else TT^.right; returnT.
Min and Max.
Мин. Ключ в дереве поиска можно найти по УК-лю leftот корня, пока зн-е очередного УК-ля не станет = 0.
Tree_Minimum(T).
1.while T^.left<>nil do TT^.left
2.returnT.
Для макс. Нужно заменить в алг-ме Tree_Minimum(T)leftнаright.
Добавление и удаление эл-та.
Эти операции сохр-ют сво-во упорядоченности. Добавление: алг-м вставляет нов. Эл-т в соответствии с бин. поиском.
Tree_Insert(T,z).
1.if T=nil then new(T)
2.T^.keyz T^.leftnil T^.rightnil
3.else if z<T^.key then Tree_Insert(T^.left,z)
4.else Tree_Insert(T^.right)
5.returnT.
Затраты операций пропорциональны высоте дерева. Удаление: возможны 3 случая.
1.удаляемая вершина не имеет сыновей.
2.удаляемая вершина имеет 1-ого сына.
3.вершина имеет 2-х сыновей.
Delete(T,k).
1.if T<> nil then if k<T^.key then Delete(T^.left,k)
2.else if k>T^.key then Delete(T^.right,k)
3.elseесли узел не имеет сыновей:
4.if (T^left=nil) and (T^.right=nil) then q:=T;T:=nil; Dispose(q).
5.elseесли узел имеет сыновей:
6.else if (T^.left=nil) then q:=T; T:=T^.right; Dispose(q).
7.else (if T^.right=nil) then q:=T; T:=T^.left; Dispose(q).
8.else Del(T^.right,T).
Del(T,q),T-ук-ль на корень дерева,q-ук-ль на замен-ю вершину.
1.if T^.left=nil then q^.keyT^.key; q1T TT^.right
2.Dispose(q1); return
3.else Del(T^.left, q).
Представление 2-ых деревьев с помощью ук-лей: узлы дерева опр-ся как переменные с фикс. Структурой, а связи м-ду ними с помощью УК-лей. Т.к. степень дерева=2, то число УК-лей тоже 2. Ссылка на пустое поддерево – nil.
Type pNode=^Node; Node=record
Info:T0; left, right:pNode
End;