
- •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. Перемножение последовательности матриц.
33. 2-3 Деревья. Основные свойства. Высота 2-3 дерева.
Дерево называется 2-3 деревом, если каждый внутренний узел имеет либо 2, либо 3 сына.
Узел имеющий 2 сына называется двухместным. Узел имеющий три сына называется трехместным.
Высота 2-3 дерева, содержащего n узлов, не может быть больше [log(n+1) - 1] (целая часть).
2-3 дерево поиска.
Ключи размещаются в соответствии со следующими правилами:
1 Двухместный внутренний узел имеет двух сыновей. Ключ двухместного узла должен быть больше, чем ключи левого поддерева и меньше, чем ключи правого поддерева.
2 Трехместный узел имеет трех сыновей. Должен содержать два элемента данных. Ключ S больше TL, но меньше TM, а ключ L больше, чем TM, но меньше TR.
3 Лист может содержать один или два элемента данных.
34 Обход 2-3 дерева.
Node2-3Tree = (S, L, Left, Middle, Right)
Обход:
Алгоритм InOrder(R)
1 if (R-лист) then
2 Обрабатываем элементы в узле R
3 else if (R – трехместный) then
4 InOrder(R^.left)
5 Обработать первый элемент
6 InOrder(R^.middle)
7 Обработать второй элемент
8 InOrder(R^.right)
9 Обработать третий элемент
10 InOrder(R^.left)
11 Обработать элемент узла
12 InOrder(R^.right)
13 end if
14 end if
Поиск:
Алгоритм Retrieve(R, key, elem)
1 if (keyR) then
2 elem данные, содержащиеся в узле R
3 return true
4 else
5 if (R – лист) then return false
6 else if (R – трехместный) then
7 if (key < R.S) then
return Retrieve(R^.left, key, elem)
8 else if ( key < R.L) then
return Retrieve (R^.middle, key, elem)
9 else return Retrieve (R^.right, key, elem)
10 end if
11 end if
12 else
13 if (key < R.S) then
14 return Retrieve(R^.left, key, elem)
15 else return Retrieve (R^.right, key, elem)
16 end if
17 end if
18 end if
35 Добавление элемента в 2 – 3 дерево.
Алгоритм вставки:
1 Нужно найти лист, на котором прекращается поиск этого элемента
2 Вставить элемент в этот узел. Если после вставки лист содержит 3 элемента – выполнить разделение:
Разделение внутреннего узла:
Разделение корня:
Алгоритм Insert (R, newelem)
1 присвоить key ключ newelem
2 найти лист leafnode, но который можно разместить ключ key
3 добавить элемент newelem в лист leafnode newelem
4 if (leafnode содержит три элемента) then
Split (leafnode)
Алгоритм Split(n)
1 if (n – корень) then
2 создать новый узел p
3 назначить узел p родителем n
4 end if
5 создать два новых узла n1, n2 и назначить их родителем узел p
6 в узел n1 записать меньший ключ из n
7 в узел n2 записать больший ключ из n
8 if (n – не является листом) then
9 n1 – родитель двух левых сыновей n
10 n2 – родитель двух правых сыновей n
11 end if
12 перенести средний ключ в узел p
13 if (p содержит 3 элемента) then
Split(p)
Эффективность – О(log(n))
36 Удаление элемента в 2 – 3 дереве.
При удалении ключа из узла возникают три варианта.
1) Если после удаления ключа в узле содержится два ключа, то после удаления ничего не меняется.
2) Если же у ключа после удаления остался один элемент, то проверяем количество потомков второго ребенка того узла, ребенком которого является узел с удаляемым ключом. Если у него два ребенка, то присваиваем ему оставшийся один элемент. Вершину, оставшуюся без детей, удаляем рекурсивно.
3) Иначе у него три ребенка. Тогда присваиваем узлу с одним ключом один из этих ключей, таким образом получая два узла с двумя ключами.
Алгоритм удаления Delete(r, key)
1 Найти позицию элемента key
2 if (elem – не лист) then
3 Поменять местами найденный элемент с симметричным приемником
4 end if
5 удаляем элемент elem из leafnode
6 if (leafnode – пуст) then Fix(leafnode)
Алгоритм Fix(n)
1 if (n – корень) then
2 удалить корень
3 else
4 установить p на родительский узел узла n
5 if (брат узла n содержит два элемента) then
6 выполнить перераспределение между n, братом и p
7 if (n – внутренний) then
8 переместить соответствующий доч. узел от брата к n
9 end if
10 else
11 установить s на брата n
12 перенести из p в s
13 if (n – внутренний) then
14 присоединить доч. узел узла n к s
15 end if
16 удалить n
17 if (p – пуст) then Fix(p)
18 end if
19 end if