- •1. Основы теории сложности. Классы сложности np и p.
- •2. Сортировка и поиск . Проверка упорядоченности массива. Способы сортировки.
- •3.Обменная сортировка (метод "пузырька", шейкер-сортировка)
- •4. Сортировка разделением (быстрая сортировка). Распределяющая сортировка.
- •5. Сортировка подсчётом. Сортировка выбором (прямой выбор, линейный выбор, квадратичная )
- •7. Пирамидальная сортировка. Сортировка слиянием (однократное и циклическое)
- •8. Стек. Основные базисные операции для работы со стеком. Организация стека на основе массива и связного списка.
- •9. Очередь. Основные операции для работы с очередью
- •10. Очередь с приоритетом. Основные операции для работы с очередью с приоритетом.
- •11. Деки. Логическая структура дека.
- •12. Списки как динамические структуры данных. Виды линейных списков. Способы формирования односвязных списков. Оценка сложности.
- •13. Односвязный список. Включение элемента в начало списка. Удаление элемента из списка по заданному номеру.
- •14. Односвязный список. Включение элемента в конец списка. Слияние 2 списков.
- •15. Двухсвязный список. Удаление и вставка элемента в список.
- •16. Циклические списки. Просмотр циклического списка.
- •17. Мультисписки. Нелинейные разветвлённые списки.
- •18. Особенности программирования рекурсивных функций. Линейная рекурсия (пример).
- •19. Смешанная, ветвящаяся и бинарная рекурсия. (примеры)
- •20. Рекурсия и поисковые задачи. Результат функции рекурсивного поиска, возврат последовательности, правила разработки.
- •21. Рекурсия и поисковые задачи. Ханойские башни. Генераторы перестановок, сортировки, алгоритмы с матрицами и др.
- •22. Деревья как рекурсивные структуры данных. Основные определения и свойства. Логическое представление и изображение деревьев.
- •23. Бинарные деревья. Вставка элемента
- •24. Бинарные деревья. Удаление элемента
- •25. Бинарные деревья. Поиск . Алгоритм представления любого дерева и леса бинарными деревьями.
- •26. Способы обхода бинарного дерева: нисходящий, восходящий, смешанный.
- •28. Сбалансированные деревья. Показатель сбалансированности. Avl-деревья.
- •29.Виды балансировки деревьев. Балансировка через массив.
- •30. Красно-чёрные деревья.
- •31. Приложения деревьев.Дерево Хаффмана. (оставь здесь 10 шрифт!!!)
- •32. Бинарная куча. Проверка основного свойства кучи.
- •33. Бинарная куча. Определение родительской и дочерних вершин.
- •34. Бинарнаякуча. Алгоритм построения кучи из произвольного массива.
- •36. Бинарная куча. Добавление элемента.
- •39. Алгоритмы вычисления хэш-функции.
- •44. Задача поиска подстрок, простейший алгоритм.
- •47. Методы разработки алгоритмов. Метод декомпозиции, динамическое программирование
- •48. Методы разработки алгоритмов. Жадные алгоритмы, поиск с возвратом, локальный поиск.
31. Приложения деревьев.Дерево Хаффмана. (оставь здесь 10 шрифт!!!)
Приложения(широкое применение):1)Трансляторы таблиц решений;2)Создание и ведение таблиц символов;3)Экономическое кодирование сообщений;4)Решение арифметических выражений. Пусть требуется закодировать длинное сообщение в виде строки битов: А В А С С D А кодом, минимизирующим длину закодированного сообщения. 1) назначим коды:
Символ Код
A 010
B 100
C 000
D 111
Каждый символ тремя битами, получим строку: 010 100 010 000 000 111 010; А В А С С D А; 7*3=21 всего 21 бит - неэффективно
2) Сделаем иначе: предположим, что каждому символу назначен 2-битовый код
Символ Код
A 00
B 01
C 10
D 11
00 01 00 10 10 11 00
А В А С С D А Тогда кодировка требует лишь 14 бит.
3) Выберем коды, которые минимизируют длину сообщения по частоте вхождений символа в строку: много вхождений - код короткий, мало вхождений - код длинный.
А -3 раза, С -2 раза, В -1 раз, D -1 раз то-есть можно:1) использовать коды переменной длины;2)код одного символа не должен совпадать с кодом другого (раскодирование идет слева направо). Если А имеет код 0 т.к часто встречается, то В, С, D - начинаются с 1, если дальше 0,то это С, следующий может быть 0 или 1: 1 - D , 0 - В; то-есть В и D различаются по последнему биту, А -по первому, С - по второму, B и D - по третьему.
Символ Код
A 0
B 10
C 110
D 111
Таким образом, если известны частоты появления символов в сообщении, то метод реализует оптимальную схему кодирования. Частота появления группы символов равна сумме частот появления каждого символа. Сообщение АВАССDА кодируется как 0 | 10| 0| 110| 110| 111| 0 и требует лишь 13 бит. ABACCDA; В очень длинных сообщениях, которые содержат символы, встречающиеся очень редко - экономия существенна.Пример:
Рис. Дерево Хаффмена
32. Бинарная куча. Проверка основного свойства кучи.
Бинарной (двоичной) кучей (binary heap) называется массив, обладающей определенными свойствами упорядоченности.
для которого выполнены три условия:
Значение в любой вершине не меньше, чем значения её потомков.
Глубина листьев (расстояние до корня) отличается не более чем на 1 слой.
Последний слой заполняется слева направо
Каждая вершина содержит ключ и информацию
Если в куче изменяется один из элементов, то она может перестать удовлетворять свойству упорядоченности. Для восстановления этого свойства служит процедура Heapify. Она восстанавливает свойство кучи в дереве, у которого левое и правое поддеревья удовлетворяют ему. Эта процедура принимает на вход массив элементов A и индекс i. Она восстанавливает свойство упорядоченности во всём поддереве, корнем которого является элемент A[i].
Если i-й элемент больше, чем его сыновья, всё поддерево уже является кучей, и делать ничего не надо. В противном случае меняем местами i-й элемент с наибольшим из его сыновей, после чего выполняем Heapify для этого сына.
Процедура выполняется за время O(log n).
Основные операции с кучами:
Проверка основного свойства кучи Heapify время работы - O(logn)
Построение кучи из произвольного массива BuildHeap - O(n)
Сортировка массива без использования дополнительной памяти SortHeap -O(nlogn)
Извлечение наибольшего (очередь с приоритетами) ExtractMax -O(logn)
Мах - O(1)
Добавление элемента InsertHeap - O(logn)
Основное свойство кучи(HEAPIFY):
для любого i (кроме корня)
A[parent(i)]>=A[i](РОДИТЕЛЬ БОЛЬШЕ СВОИХ ПОТОМКОВ ИНАЧЕ ПОМЕНЯТЬ МЕСТАМИ)
Функция:
void Heap::Heapify(int ix){
int l=Left(ix),r=Right(ix),irl=ix;
if(l>0){
if(isGreat(Storage[l],Storage[ix])) irl=l;
if(r>0&&isGreat(Storage[r],Storage[irl])) irl=r;
if(irl!=ix){
Swap(ix,irl);
Heapify(irl);}}}