
- •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. Методы разработки алгоритмов. Жадные алгоритмы, поиск с возвратом, локальный поиск.
33. Бинарная куча. Определение родительской и дочерних вершин.
Бинарной (двоичной) кучей (binary heap) называется массив, обладающей определенными свойствами упорядоченности.
для которого выполнены три условия:
Значение в любой вершине не меньше, чем значения её потомков.
Глубина листьев (расстояние до корня) отличается не более чем на 1 слой.
Последний слой заполняется слева направо
Каждая вершина содержит ключ и информацию
Если в куче изменяется один из элементов, то она может перестать удовлетворять свойству упорядоченности. Для восстановления этого свойства служит процедура Heapify. Она восстанавливает свойство кучи в дереве, у которого левое и правое поддеревья удовлетворяют ему. Эта процедура принимает на вход массив элементов A и индекс i. Она восстанавливает свойство упорядоченности во всём поддереве, корнем которого является элемент A[i].
Для каждого элемента множества по индексу можно определить левую и правую дочерние вершины. Для родительской, левой и правой дочерней вершины задаются определенным для каждого виды вершины способом индекс.
Определение родительской вершины:
int Heap::Parent(int ix)
{ return (ix+1)/2-1; }
Определение левой дочерней вершины:
intHeap::Left(intix)
{ return (2*ix+1>=Size)?-1:(2*ix+1); }
Определение правой дочерней вершины:
int Heap::Right(int ix)
{ return (2*ix+2>=Size)?-1:(2*ix+2); }
34. Бинарнаякуча. Алгоритм построения кучи из произвольного массива.
Бинарной (двоичной) кучей (binary heap) называется массив, обладающей определенными свойствами упорядоченности.
для которого выполнены три условия:
Значение в любой вершине не меньше, чем значения её потомков.
Глубина листьев (расстояние до корня) отличается не более чем на 1 слой.
Последний слой заполняется слева направо
Каждая вершина содержит ключ и информацию
Если в куче изменяется один из элементов, то она может перестать удовлетворять свойству упорядоченности. Для восстановления этого свойства служит процедура Heapify. Она восстанавливает свойство кучи в дереве, у которого левое и правое поддеревья удовлетворяют ему. Эта процедура принимает на вход массив элементов A и индекс i. Она восстанавливает свойство упорядоченности во всём поддереве, корнем которого является элемент A[i].
Алгоритм построения кучи из произвольного массива: неэффективны по времени выполнения основных операций: поиск, для поддержки упорядоченность массива по ключу, - "неудобна" операция вставки нового элемента.
Object* Build(intmaxsize,CMP(*f)(void*,void*),void* x[]){
Heap* rc=new Heap(maxsize,f,x);
rc->Size=rc->MaxSize;
for(int i=(rc->Size-1)/2;i>=0;i--) rc->Heapify(i);
returnrc;}
Массив x[1..N]
Heapify к массиву в порядке убывания начиная с вершины c [(N-1)/2]
- удовлетворяют основному свойству
Сортировка массива без использования дополнительной памяти SortHeap:
выполнить процедуру BuildHeap;
обменять местами элементы A[0] и A[n-1];
уменьшить размер кучи на единицу:
выполнить процедуру Heapify для элемента 0 и т.д.
35. Бинарная куча. Извлечение наибольшего элемента. Оценка сложности
Бинарной (двоичной) кучей (binary heap) называется массив, обладающей определенными свойствами упорядоченности.
для которого выполнены три условия:
Значение в любой вершине не меньше, чем значения её потомков.
Глубина листьев (расстояние до корня) отличается не более чем на 1 слой.
Последний слой заполняется слева направо
Каждая вершина содержит ключ и информацию
Если в куче изменяется один из элементов, то она может перестать удовлетворять свойству упорядоченности. Для восстановления этого свойства служит процедура Heapify. Она восстанавливает свойство кучи в дереве, у которого левое и правое поддеревья удовлетворяют ему. Эта процедура принимает на вход массив элементов A и индекс i. Она восстанавливает свойство упорядоченности во всём поддереве, корнем которого является элемент A[i].
Извлечение наибольшего элемента (макс. зн. содержится в самой верхнем родителе):
ExtractMax – извлечение наибольшего (используется в очередях с приоритетами).
Процедура ExtractMax- извлекает из кучи максимальный элемент, не нарушая основного свойства кучи.
Алгоритм ExtractMax:
сохранить значение элемента A[0] в промежуточной памяти;
записать значение последнего элемента кучи A[N-1] в A[0];
уменьшить на единицу размер кучи;
выполнить процедуру Heapify для элемента 0.
Сложность T[N] ExtractMax состоит из сложности алгоритма Heapify и плюс фиксированное число операций, т.е. T[N]=O(log2N)+O(1)=O(log2N).
void* Heap::ExtractMax()
{
void* rc;
if(!isEmpty())
{
rc=Storage[0];
Storage[0]=Storage[Size-1];
Size--;
Heapify(0);
}
else throw (ExcEmpty)EXTRACT;
returnrc;
}