- •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. Методы разработки алгоритмов. Жадные алгоритмы, поиск с возвратом, локальный поиск.
2. Сортировка и поиск . Проверка упорядоченности массива. Способы сортировки.
Сортировка – процесс упорядочивания набора элементов в возрастающем или убывающем порядке. Поиск значения путем последовательного перебора всех элементов называется линейным поиском. Его трудоемкость в среднем Tср(N)=N/2 => O(N). Двоичный поиск в упорядоченных данных. Если данные упорядочены, то найти интересующий нас можно значительно быстрее. Алгоритм двоичного или бинарного поиска основан на делении пополам текущего интервала поиска. В основе его лежит тот факт, что при однократном сравнении искомого элемента и некоторого элемента массива мы можем определить, справа или слева от текущего следует искать. Проще всего выбирать элемент на середине интервала, в котором производится поиск. Основные идеи такого алгоритма:
· искомый интервал поиска делится пополам и по значению элемента массива в точке деления определяется, в какой части следует искать значение на следующем шаге цикла;
· для выбранного интервала поиск повторяется;
· при «сжатии» интервала в 0 поиск прекращается;
· в качестве начального интервала выбирается весь массив.
Алгоритм имеет гарантированную логарифмическую трудоемкость Tmax=log2(N).
Проверка упорядоченности. Функция проверки упорядоченности массива является живой иллюстрацией теоремы: массив упорядочен, если упорядочена любая пара соседних элементов.
Int is_sorted(int a[], int n){
for (int i=0; i<n-1; i++)
if (a[i]>a[i+1]) return 0;
return 1;}
Виды сортировок: Обменная, Разделением, Подсчетом, Выбором, Вставками, Пирамидальная, Распределяющая, Слиянием
3.Обменная сортировка (метод "пузырька", шейкер-сортировка)
Пузырьковая. Один из наиболее широко известных алгоритмов сортировки. В этом методе массив также делится на две части: отсортированную и не отсортированную. На каждом шаге метода осуществляют проход от меньших индексов к большим по не отсортированной части, каждый раз сравнивая два соседних элемента: если они не упорядочены между собой (меньший следует за большим), то меняют их местами. Тем самым за один проход путем последовательных обменов наибольший элемент не отсортированной части сдвинется к ее концу.
Алгоритм называют пузырьковой сортировкой, потому что на каждом шаге наибольший элемент не отсортированной части подобно пузырьку газа в воде всплывает вверх.
Сортировка осуществляется за несколько проходов. В том случае, когда за очередной проход не было сделано ни одного обмена, то массив отсортирован .
Шейкер. Суть алгоритма в том, что данные сортируются "волнообразно", при этом программа сначала проходит массив слева направо, а потом справа налево. Когда идем слева, то собираем справа большие числа, а когда справа, то собираем слева меньшие.
4. Сортировка разделением (быстрая сортировка). Распределяющая сортировка.
Быстрая сортировка.
выбрать элемент, называемый опорным.
сравнить все остальные элементы с опорным, на основании сравнения разбить множество на три — «меньшие опорного», «равные» и «большие», расположить их в порядке меньшие-равные-большие.
повторить рекурсивно для «меньших» и «больших».
Примечание: на практике обычно разделяют сортируемое множество не на три, а на две части: например, «меньшие опорного» и «равные и большие». Такой подход в общем случае оказывается эффективнее, так как для осуществления такого разделения достаточно одного прохода по сортируемому множеству и однократного обмена лишь некоторых выбранных элементов. Достоинства:
1.Один из самых быстродействующих (на практике) из алгоритмов внутренней сортировки общего назначения;
2.Прост в реализации.
3.Требует лишь o(ln (n)) дополнительной памяти для своей работы. (Не улучшенный рекурсивный алгоритм в худшем случае o(n) памяти)
Недостатки: Сильно деградирует по скорости (до ) при неудачных выборах опорных элементов, что может случиться при неудачных входных данных.
Распределяющая сортировка.
Быстрая сортировка состоит в том, что список В= реорганизуется в список B',,B", где В' - подсписок В с элементами, не большими К1, а В" - подсписок В с элементами, большими К1. В списке B',,B" элемент К1 расположен на месте, на котором он должен быть в результирующем отсортированном списке. Далее к спискам B' и В" снова применяется упорядочивание быстрой сортировкой. Приведем в качестве примера сортировку списка, отделяя упорядоченные элементы косой чертой, а элементы Ki знаками <и>.
Пример:
9, 7, 18, 3, 52, 4, 6, 8, 5, 13, 42, 30, 35, 26
7, 3, 4, 6, 8, 5/ <9>/ 18, 52, 13, 42, 30, 35, 26
3, 4, 6, 5/<7>/ 8/ 9/ 13/ <18>/ 52, 42, 30, 35, 26
<3>/ 4, 6, 5/ 7/ 8/ 9/ 13/ 18/ 42, 30, 35, 26/ <52>
3/ <4>/ 6, 5/ 7/ 8/ 9/ 13/ 18/ 30, 35, 26/ <42>/ 52
3/ 4/ 5/ <6>/ 7/ 8/ 9/ 13/ 18/ 26/ <30>/ 35/ 42/ 52
Время работы по сортировке списка методом быстрой сортировки зависит от упорядоченности списка. Оно будет минимальным, если на каждом шаге разбиения получаются подсписки B' и В" приблизительно равной длины, и тогда требуется около N*log2(N) шагов. Если список близок к упорядоченному, то требуется около (N*N)/2 шагов.