- •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. Методы разработки алгоритмов. Жадные алгоритмы, поиск с возвратом, локальный поиск.
21. Рекурсия и поисковые задачи. Ханойские башни. Генераторы перестановок, сортировки, алгоритмы с матрицами и др.
Первая часть вопроса находится в 20 билете. Ханойские башни. Имеются три стержня с номерами 1,2,3. На стержень 1 надето n дисков различного диаметра так, что они образуют пирамиду. Нужно переместить эти три диска в такой же последовательности (1,2,3) на третий стержень. Для n дисков минимальное число необходимых перемещений равно 2^n-1. Перемещения таковы:
М-3, C-2, М-2, Б-3, М-1, С-3, М-3.
Void tn(int n, int i, int j, int w)
{ if (n>1) { tn (n-1,i,w,j);tn (1,i,j,w);tn (n-1,w,j,i); }
elseprintf(" \n %d -> %d",i,j);return ; }
Генератор перестановок - это программа, которая генерирует все возможные перестановки элементов некоторого множества. Например, для множества из трёх элементов {1,2,3} это будут (если отсортировать «по алфавиту»):
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
Общее количество перестановок для множества мощностью n считается по формуле: n!
Рекурсия естественным образом «всплывает» в сортировках, основанных на перераспределении элементов исходной последовательности: их разделении на части и обратном слиянии. В процессе разделения к полученным частям применяется тот же самый алгоритм до тех пор, пока не получатся части единичной (или нулевой) размерности, «сборка» (слияние) частей осуществляется в обратном порядке – после возвращения из рекурсивного вызова. В рекурсивном разделении частичная упорядоченность устанавливается в процессе разделения путем разбиения исходной последовательности (массива, списка) на две части по принципу «меньше-больше» некоторого срединного значения, называемого медианой.
Рекурсивное разделение массива. В процессе разделения массива должно происходить физическое перемещение элементов, чтобы они заняли соответствующее положение относительно медианы. Если в результате такого перемещения на исходном интервале мы получим новое размещение элементов по принципу «меньшие-медиана-большие», то необходимость в слиянии отпадет, поскольку после рекурсивного вызова упорядоченные части «будут занимать свои места». В быстрой сортировке -- рекурсия для частей БЕЗ медианы.
К рекурсивным алгоритмам с матрицами относится алгоритм Штрассена. Он предназначен для быстрого умножения матриц. Время его работы Θ( )= Θ( ), что даёт заметный выигрыш на больших плотных матрицах (начиная, примерно, от 64×64). Несмотря на то, что алгоритм Штрассена является не самым быстрым из существующих алгоритмов быстрого умножения матриц, он проще программируется, поэтому именно он чаще используется на практике. Он был усовершенствован в 2011 году до уровня .
22. Деревья как рекурсивные структуры данных. Основные определения и свойства. Логическое представление и изображение деревьев.
Дерево - это граф, который характеризуется следующими свойствами:
1. Существует единственный элемент, на который не ссылается никакой другой элемент - и который называется КОРНЕМ. 2.Начиная с корня и следуя по определенной цепочке указателей, содержащихся в элементах, можно осуществить доступ к любому элементу структуры. 3. На каждый элемент, кроме корня, имеется единственная ссылка, т.е. каждый элемент адресуется единственным указателем.
Определение дерева имеет исключительно рекурсивную природу. Дерево представляет собой либо отдельную вершину, либо вершину, имеющую ограниченное число указателей другие деревья. Линия связи между парой узлов дерева называется обычно ВЕТВЬЮ. Нижележащие деревья для текущей вершины называются поддеревьями, а их вершины - потомками. Те узлы, которые не ссылаются ни на какие другие узлы дерева, называются ЛИСТЬЯМИ. По отношению к потомкам текущая вершина называется предком. Узел, не являющийся листом или корнем, считается промежуточным или узлом ветвления (нетерминальной или внутренней вершиной).
Основные операции над деревьями:
1) Поиск узла с заданным ключом.2) Добавление нового узла.
3) Удаление узла (поддерева).4) Обход дерева в определенном порядке: Нисходящий обход; Смешанный обход; Восходящий обход;
Логическое представление и изображение деревьев.
Имеется ряд способов графического изображения деревьев. Первый способ заключается в использовании для изображения поддеревьев известного метода диаграмм Венна, второй - метода вкладывающихся друг в друга скобок, третий способ - это способ, применяемый при составлении оглавлений книг. Последний способ, базирующийся на формате с нумерацией уровней, сходен с методами, используемыми в языках программирования. При применении этого формата каждой вершине приписывается числовой номер, который должен быть меньше номеров, приписанных корневым вершинам присоединенных к ней поддеревьев. Отметим, что корневые вершины всех поддереьев данной вершины должны иметь один и тот же номер.
МЕТОД ВЛОЖЕННЫХ СКОБОК V0(V1(V2(V5)(V6))(V3)(V4))(V7(V8)(V9(V10))))
Представление дерева : а)- исходное дерево, б)- оглавление книг, в)- граф, г)- диаграмма Венна