
- •Предмет изучения дисциплины "Структуры и алгоритмы обработки данных на эвм". Абстрактные типы данных. Классификация структур данных.
- •Хеширование. Хеш-функции. Коллизии и методы их устранения. Сферы применения хеширования, достоинства метода.
- •Деревья: поисковое дерево, идеально - сбалансированное дерево, сбалансированное поисковое дерево, в-дерево. Рекурсивные методы прохождения деревьев. Алгоритмы построения деревьев.
- •Сферы применения графов. Способы машинного представления графов, их достоинства и недостатки.
- •Алгоритмы поиска в графе: поиск в ширину, поиск в глубину.
- •Эйлеров путь, эйлеров цикл, эйлеров граф. Алгоритм нахождения эйлерова цикла.
- •Нахождение кратчайших расстояний. Алгоритм Дейкстры.
- •Алгоритмы с возвратом.
- •Алгоритм нахождения гамильтоновых циклов в графе.
- •Метод ветвей и границ.
- •Остовные деревья графа. Алгоритмы нахождения дерева минимального веса: алгоритм Прима, алгоритм Крускала.
- •Эффективность алгоритмов и её составляющие. Алгоритмы и их сложность. Доминирование. О-функции и их особенности.
- •Правила для определения сложности. Функции, часто используемые для оценки сложности алгоритмов (список функционального доминирования). Сравнение алгоритмов с различными порядками сложности.
- •Анализ алгоритмов и определение их сложности по управляющим структурам. Контрольные замеры. Критический взгляд на о-анализ. (ограниченность о-анализа).
- •Полиномиальные алгоритмы и труднорешаемые задачи. Два аспекта труднорешаемости задач. Недетерминированное вычисление и класс np.
- •Теория np-полных задач. Структура класса np.
- •Методы решения np-полных задач. Применение теории np-полноты для анализа задач.
Эффективность алгоритмов и её составляющие. Алгоритмы и их сложность. Доминирование. О-функции и их особенности.
Существует множество задач, решение которых с вычислительной точки зрения лежит за пределами возможностей человеческого мозга.
Эффективность программы является важной ее характеристикой и имеет две составляющие: память и время. Пространственная составляющая измеряется количеством памяти, требуемой для выполнения программы. Временная эффективность программы определяется временем, необходимым для ее выполнения. Лучший способ сравнения эффективности алгоритмов состоит в сопоставлении их порядков сложности, причем метод применим как к пространственной, так и к временной составляющей. Порядок сложности алгоритма выражает его эффективность через количество обрабатываемых данных.
Число шагов работы программы, как функции от размерности, называется сложностью алгоритма. Порядок алгоритма - это функция, доминирующая над точным выражением временной сложности. Говорят, что функция g(x) доминирует над функцией f(x), если существует некоторая константа C такая, что C*g(a) > f(a) для всех значений a.
При анализе сложности используют частный случай доминирования, известный как ассимптотическое доминирование. Функция g(x) синтаксически доминирует над f(x).
Хорошая функциональная оценка должна доминировать над действительной функцией и должна быть близка к действительной функции насколько это возможно.
Для обозначения порядка сложности алгоритма используют так называемое О-обозначение. О-функции выражают относительную скорость алгоритма в зависимости от некоторой переменной или переменных.
Существуют три правила для определения сложности:
1. О(k*f) = O(f), где f - функция, а k - const.
Постоянные множители не имеют значения для определения порядка сложности.
2. O(f*g) = O(f) * O(g), где f, g - функции.
Порядок сложности произведения двух функций равен произведению их сложности.
3. O(f+g) = доминанта [O(f), O(g)]
Для применения третьего правила необходимо понимание различий доминирущих функций, поэтому рассмотрим список функционального доминирования функций, часто используемых для оценки сложности алгоритма. Функции приведем в порядке убывания доминирования.
X^x доминирует над X!
X! доминирует над a^x
a^x доминирует над b^x, если a > b
a^x доминирует над x^n, если a > 1
x^n доминирует над x^m, если n > ma
x доминирует над logax, если a > 1
loga(x) доминирует над logb(x), если b > a > 1
loga(x) доминирует над -1
где m, n, a, b - const
Алгоритмы O(1) принято называть алгоритмами константой сложности. Это алгоритмы, требующие одного и того же времени независимо от размера данных.
Порядок алгоритма полиномиальной сложности обозначается O(x^n).
Алгоритмы, имеющие сложность более высокого порядка называются NP-сложные. Приведем сравнение роста времени выполнения для алгоритмов, характеризующихся различными порядками сложности.
Одно из свойств алгоритма – эффективность. Эффективность программы является её очень важной характеристикой. Пользователь всегда предпочитает более эффективное решение даже в тех случаях, когда эффективность не является решающим фактором.
Эффективность имеет две составляющие – память (пространство) и время. Пространственная эффективность измеряется количеством памяти, требуемой для выполнения программы. В некоторых случаях память становится доминирующим фактором в оценке эффективности программы, однако, в последние годы в связи с её новым быстрым удешевлением, этот фактор эффективности постепенно теряет свое значение. Временная эффективность программы определяется временем, необходимым для её выполнения.
Программист, как правило, может уделить лишь незначительное время рассмотрению сложности. Для него важно только идентифицировать основные различия алгоритмов. Лучший способ сравнения эффективности алгоритмов состоит в сопоставлении их порядков сложности. Этот метод применим как к временной, так и к пространственной составляющей сложности. Порядок сложности алгоритма выражает его эффективность через количество обрабатываемых данных. Число шагов работы программы как функция от размерности входа называется сложностью алгоритма. Порядок алгоритма – это функция, доминирующая над точным выражением временной сложности.