- •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. Перемножение последовательности матриц.
71. Поиск подстрок. Алгоритм Рабина-Карпа
Алгоритм Рабина — Карпа — это алгоритм поиска строки, который ищет шаблон, то есть подстроку, в тексте, используя хеширование. Он был разработан в 1987 году Майклом Рабином и Ричардом Карпом.
Алгоритм редко используется для поиска одиночного шаблона, но имеет значительную теоретическую важность и очень эффективен в поиске совпадений множественных шаблонов. Для текста длины n и шаблона длины m его среднее время исполнения и лучшее время исполнения - это O(n), но в (весьма нежелательном) худшем случае он имеет производительность O(nm), что является одной из причин того, почему он не слишком широко используется. Однако алгоритм имеет уникальную особенность находить любую из k строк менее чем за время O(n) в среднем, независимо от размера k.
Одно из простейших практических применений алгоритма Рабина — Карпа состоит в определении плагиата. Скажем, например, что студент пишет работу по Моби Дику. Коварный профессор находит различные исходные материалы поМоби Дику и автоматически извлекает список предложений в этих материалах. Затем, алгоритм Рабина — Карпа может быстро найти в проверяемой статье примеры вхождения некоторых предложений из исходных материалов. Для устранения чувствительности алгоритма к небольшим различиям, можно игнорировать детали, такие как регистр или пунктуация при помощи их удаления. Поскольку количество строк, которые мы ищем, k, очень большое, обычные алгоритмы поиска одиночных строк становятся неэффективными.
RK(T[1..n],P[1..m],d,q)
h←dm-1modq
p←0
t←0
for i=1 to m do
p←(p*d+p[i])modq
t←(t*d+T[i])modq
end for
for S=0 to n-m do
if p=t then
if (P[1..m] = T[s+1..s+m]) then
print(“Обработка входящих со сдвигом”,s)
if s<n-m then
t←((t-T[s+1]*k)d+T[S+m+k])modq
end for
72 Равномерный и неравномерный код. Префиксное кодирование.
Более короткие коды не совпадают с более длинными. Например, есть код {«0»,«10»,«11»}.
Допустим, а=0; b=10; c=11.
Тогда сообщение abac закодируем:”010011”, а можно ли преобразовать обратно? Первый символ – а однозначно. Следующий 1 полностью не определяет символ, «10» - b, следующий – a, после с.
Например, есть текст a,b,c,d,e,f. В файле 100 000 символов, причем а – 45 000, b – 13 000, c – 12 000, d – 16 000, e – 9 000, f – 5 000.
Посмотрим, как влияет кодирование на размер файла:
Равномерный код.
Так как 6 символов кодируем в 3 битовом коде:
a=000, b=0001, c=010, d=011, e=100, f=101. Соответственно файл будет 300 000 бит.
Неравномерный код.
Те числа, что встречаются часто кодируем короткими битами, редкие – длинными. A=0, b=101, c=100, d=111, e=1101, f=1100.
Для представления используем кодовые деревья.
Известными алгоритмами построения кодовых деревьев являются алгоритм Хофмана, Фано-Шенона.
73. Алгоритм Шеннона – Фано
Алгоритм Шеннона — Фано — один из первых алгоритмов сжатия, который впервые сформулировали американские учёные Шеннон и Фано. Алгоритм использует коды переменной длины: часто встречающийся символ кодируется кодом меньшей длины, редко встречающийся — кодом большей длины. Основные этапы: 1) Символы первичного алфавита m1 выписывают в порядке убывания вероятностей. 2)Символы полученного алфавита делят на две части, суммарные вероятности символов которых максимально близки друг другу. 3)В префиксном коде для первой части алфавита присваивается двоичная цифра «0», второй части — «1». 4)Полученные части рекурсивно делятся и их частям назначаются соответствующие двоичные цифры в префиксном коде. Код Шеннона — Фано строится с помощью дерева. Построение этого дерева начинается от корня. Всё множество кодируемых элементов соответствует корню дерева (вершине первого уровня). Оно разбивается на два подмножества с примерно одинаковыми суммарными вероятностями. Эти подмножества соответствуют двум вершинам второго уровня, которые соединяются с корнем. Далее каждое из этих подмножеств разбивается на два подмножества с примерно одинаковыми суммарными вероятностями. Им соответствуют вершины третьего уровня. Если подмножество содержит единственный элемент, то ему соответствует концевая вершина кодового дерева; такое подмножество разбиению не подлежит. Подобным образом поступаем до тех пор, пока не получим все концевые вершины. Ветви кодового дерева размечаем символами 1 и 0. Пример кодового дерева: Исходные символы: A (частота встречаемости 50), В(частота встречаемости 39), C (18), D (49), E (35), F (24).
Полученный код: A — 11, B — 101, C — 100, D — 00, E — 011, F — 010.
Алгоритм Fano(P[1..n])
C:array [1..n][1..L] of 0..1
Fano1(1,n,0)
Fano1(b,e,k)
If e>b then
K←k+1
m←Med(b,e)
For i=b to e do
If i<=m then k-ому коду i-ого символа
C[I,k] ←0
Else C[I,k] ←1
Fano1(b,m,k)
Fano1(m+1,e,k)
End if
Med(b,e)
Sb ←0
For i=b to e-1 do
Sb ←Sb+P[i]
Se ←P[e]
m ←e
repeat
d ←Sb-Se
m ←m-1
Sb ←Sb-P[m]; Se ←Se+P[m]
Until |Sb-Se|>=d
Return m