
- •Предмет изучения дисциплины "Структуры и алгоритмы обработки данных на эвм". Абстрактные типы данных. Классификация структур данных.
- •Хеширование. Хеш-функции. Коллизии и методы их устранения. Сферы применения хеширования, достоинства метода.
- •Деревья: поисковое дерево, идеально - сбалансированное дерево, сбалансированное поисковое дерево, в-дерево. Рекурсивные методы прохождения деревьев. Алгоритмы построения деревьев.
- •Сферы применения графов. Способы машинного представления графов, их достоинства и недостатки.
- •Алгоритмы поиска в графе: поиск в ширину, поиск в глубину.
- •Эйлеров путь, эйлеров цикл, эйлеров граф. Алгоритм нахождения эйлерова цикла.
- •Нахождение кратчайших расстояний. Алгоритм Дейкстры.
- •Алгоритмы с возвратом.
- •Алгоритм нахождения гамильтоновых циклов в графе.
- •Метод ветвей и границ.
- •Остовные деревья графа. Алгоритмы нахождения дерева минимального веса: алгоритм Прима, алгоритм Крускала.
- •Эффективность алгоритмов и её составляющие. Алгоритмы и их сложность. Доминирование. О-функции и их особенности.
- •Правила для определения сложности. Функции, часто используемые для оценки сложности алгоритмов (список функционального доминирования). Сравнение алгоритмов с различными порядками сложности.
- •Анализ алгоритмов и определение их сложности по управляющим структурам. Контрольные замеры. Критический взгляд на о-анализ. (ограниченность о-анализа).
- •Полиномиальные алгоритмы и труднорешаемые задачи. Два аспекта труднорешаемости задач. Недетерминированное вычисление и класс np.
- •Теория np-полных задач. Структура класса np.
- •Методы решения np-полных задач. Применение теории np-полноты для анализа задач.
Алгоритмы с возвратом.
Общим методом организации исчерпывающего поиска, позволяющего значительно сократить число шагов в алгоритмах полного перебора, является “возвратный код” по упорядочиванию множества частичных возможных решений. Он основан на том, что мы пытаемся расширить текущее частичное решение, то есть изучить множество возможных полных решений, которые не противоречат текущему частичному решению. Если расширение невозможно на текущем шаге, то происходит возврат к предыдущему, более короткому, частичному решению и делается попытка его расширения другим способом.
Искомое решение
должно иметь вид
.
В качестве частичного начального решения
берется пустая последовательность
длины
:
.
На данном частичном решении
предпринимается попытка найти такое
допустимое значение
,
относительно которого невозможно сразу
заключить, что либо
можно расширить до некоторого решения,
либо
уже является решением. Если такое
предполагаемое, но еще не использованное
значение
существует, то мы добавляем его к нашему
частичному решению и продолжаем процесс
для последовательности
.
В противном случае происходит возврат
к частичному решению
и попытка найти новое, еще не использованное
значение
.
Предположение:
для каждого
существует некоторое множество
,
из которого производится выбор кандидатов
для
-ой
координаты частичного решения без учета
ограничений задачи. В общем случае,
ограничения, описывающие решение,
говорят о том, из какого подмножества
множества
производится выбор кандидатов для
расширения частичного решения от
до
.
Если частичное
решения не предоставляет для выбора
нового
,
то есть у частичного решения
либо вовсе нет кандидатов для расширения,
либо все кандидаты к данному моменту
уже были использованы, то происходит
возврат назад и выбор нового элемента
из
.
Предположение:
существует некоторая функция, которая
некоторому произвольному частичному
решению
ставит в соответствие функцию
таким образом, что если
,
то частичное решение нельзя расширить
до полного решения, если
,
то значение
допустимо для частичного решения
,
но это не означает, что
обязательно расширится до полного
решения.
Алгоритм нахождения гамильтоновых циклов в графе.
Каждый гамильтонов
цикл можно представить в виде
,
где
.
Работу алгоритма поиска гамильтонова
цикла можно проиллюстрировать процессом
поиска в некотором дереве. Каждая вершина
этого дерева соответствует некоторой
последовательности
,
причем все вершины соответствующей
последовательности
являются сыновьями этой вершины. Корень
соответствует пустой последовательности
.
Рассмотрим полное
дерево, состоящее из всех возможных
последовательностей вида
,
где
.
Допустим, что элемент
является допустимым для
,
то есть
,
если
,
и ни один элемент не является допустимым
для
,
то есть
,
если
.
Тогда вызов процедуры с первой вершины вызывает поиск в глубину во всем дереве, начиная от корня . Причем процесс поиска опускает рассмотрение вершин поддерева с корня до каждой встреченной недопустимой вершины. В этом и заключается эффективность алгоритма с возвратом по сравнению с полным перебором. Хотя для большинства приложений число шагов алгоритма с возвратом в наихудшем случае растет по экспоненте с возрастанием размерности задачи.