- •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. Методы разработки алгоритмов. Жадные алгоритмы, поиск с возвратом, локальный поиск.
11. Деки. Логическая структура дека.
Дек - особый вид очереди. Дек (от англ. deq - doubleendedqueue,т.е очередь с двумя концами) - это такой последовательный список, в котором как включение, так и исключение элементов может осуществляться с любого из двух концов списка. Частный случай дека - дек с ограниченным входом и дек с ограниченным выходом. Логическая и физическая структуры дека аналогичны логической и физической структуре кольцевой FIFO-очереди. Однако, применительно к деку целесообразно говорить не о начале и конце, а о левом и правом конце.
Операции над деком:
включение элемента справа;
включение элемента слева;
исключение элемента справа;
исключение элемента слева;
определение размера;
очистка;
12. Списки как динамические структуры данных. Виды линейных списков. Способы формирования односвязных списков. Оценка сложности.
Динамическая структура данных – множество переменных, связанных между собой указателями. Список представляет собой линейную последовательность переменных, каждая из которых связана указателями со своими соседями. Списки бывают следующих видов: 1) односвязные -каждый элемент списка имеет указатель на следующий;2) двусвязные - каждый элемент списка имеет указатель на следующий и на предыдущий элементы; 3) двусвязный циклический список - первый и последний элементы списка ссылаются друг на друга, таким образом цепочка представляет собой кольцо. Необходимо отметить основное свойство списков как структур данных. Последовательность обхода списка, естественно, зависит не от физического размещения элементов списка в памяти, а от последовательности из связывания указателями. Точно так же определяется нумерация элементов списка - логический номер элемента в списке - это номер, получаемый им в процессе движения по списку.
Способы формирования списков
Вариант 1. Элементы - обычные переменные, связи инициализируются транслятором, вся структура данных "зашита" в программный код
struct list
{ list *next;
int val;} a={0,NULL}, b={1,&a}, c={2,&b}, *ph = &c;
Вариант 2. Элементы списка создаются в обычном массиве, поэтому их количество ограничено. Связи устанавливаются динамически, то есть программой. Такой вариант используется, когда заданное количество элементов образуют несколько различных динамических структур, переходя из одной в другую. Примером является управление задачами в операционной системе, которые в процессе работы организуются в несколько различных очередей (списков):
struct list A[100],*ph; // Создать спис. из элем., размещ. в статическом массиве
for (i=0; i<99; i++)
{
A[i].next = A+i+1;
A[i].val = i;
}
A[99].next = NULL;
ph = A;
Вариант 3. Элементы списка являются динамическими переменными, связи между ними устанавливаются программно
list *InsertFirst(list *ph, int n)// Включить в начало списка ph - заголовок списка n - Значение элемента списка
{ list *pnew;
pnew = new list; // Создать элемент списка -
pnew->val = n; // динамическую переменную,
pnew->next = *ph; // заполнить его и
ph = pnew; // поместить в начало списка
return ph; // вернуть новый заголовок
}
Сложность добавления/удаления элемента - O( 1 ), т.к. не затрагивает остальные элементы контейнера. Сложность поиска - O( n ).