
- •1.Обоснование выбора подходящей структуры данных на примере задачи «Ряд Фаррея»
- •2 И 4 на одном листе
- •2.Лексикографическая сортировка последовательностей одинаковой длины
- •4.Решение задачи построения связной сети методом взвешенного быстрого объединения со сжатием пути.
- •5.Меры временной сложности алгоритмов. Оценки в среднем и в худшем случаях. Амортизированное время
- •6.Модели вычислений: Машина Тьюринга, расп, рам, неветвящиеся программы, деревья решений
- •7.Асимптотические обозначения времени выполнения программ. Оценки снизу, сверху, асимптотически точные. Правило суммы и правило произведения
- •8.Нижние оценки точности. Нижние оценки сложности для задачи сортировки, построения выпуклой оболочки
- •9.Сводимость задач и ее свойства
- •11.Задача построения максимальной суммы для подпоследовательности заданной последовательности целых чисел. Метод последовательных уточнений
- •13. Полиномиальная сводимость и ее свойства
- •14. Класс np полных задач. Примеры
- •15.Абстрактные типы данных: последовательность, множество, отображение
- •16.Линейные структуры данных: массив, список, стек, очередь, дек. Способы представления, очереди над ними
- •§ IsEmpty(): возвращает логическое значение, подтверждающее, что
- •17.Нелинейные структуры данных: деревья, графы. Обходы деревьев в глубину и ширину
- •§ IsInternal(p): проверяет, является ли p позицией внутренней вершины (не листа) .
- •§ IsExternal(p): проверяет, является ли p позицией листа дерева.
- •§ IsRoot(p): проверяет, является ли p позицией корня.
- •§ Insert(h, х): вставляет вершину х (с заполненным полем key) в пирамиду н.
- •18.Внутренняя сортировка (массивов).
- •19.Элементарные методы сортировки: обмен, вставка, выбор.
- •20.Улучшенные методы сортировки (Шелла, Сортдеревом).
- •21.Быстрая сортировка - упорядочение за среднее время о(n log n).
- •20.Задача поиска. Деревья бинарного поиска (дбп). Операции над ними.
- •23.Задача поиска. Деревья, сбалансированные по высоте. Основные типы
- •24. Задача поиска. Красно-черные деревья. Задача балансировки для красно-черных деревьев.
- •25.Атд Словарь. Реализация словаря 2-3 деревьями.
- •26.Хеширование, или метод вычисляемого адреса. Хеш-функции. Разрешение коллизий.
- •27.Алгоритмы «разделяй и властвуй».
- •28.Динамическое программирование. Алгоритм нахождения кратчайшего пути Дейкстры
- •29.«Жадные» алгоритмы. Алгоритм Краскала
- •30.Поиск с возвратом. Задача разбиения множеств
- •31.Алгоритмы локального поиска.
- •32.Приближенные алгоритмы.
5.Меры временной сложности алгоритмов. Оценки в среднем и в худшем случаях. Амортизированное время
Наихудшее и среднее время работы.
Характер (и диапазон) изменения времени работы алгоритма обычно зависит от «объема» входных данных. Причем смысл понятия «объем» может зависеть от вида задачи, например, для задачи «Найти n-е простое число» видимо значение n является реалистичным смыслом для понятия «объем», а для задачи «Вычислить сумму n чисел» важны скорее не значения слагаемых, а их количество n. Оценивая время работы алгоритма некоторой функцией T(n) от «объема» входа, мы получаем возможность сравнивать алгоритмы, отвлекаясь от разнообразия входов «объема» n, сравнивать их по скорости роста их функции T(n). При этом возникают вопросы, как и для каких конкретно входных данных производить сравнение. Выбор 10 А это напрямую связано с анализом алгоритма решения задачи
конкретной функции T(n) сильно зависит от решаемой проблемы, от возможностей анализа исходных данных. Рассмотрим некоторые наиболее часто используемые определения этой функции.
§ Время в наихудшем случае. Определим T(n) как время работы на самом плохом входе, на котором алгоритм затрачивает максимальное время среди всех входов «объема» n. Такое определение T(n) акцентирует внимание на гарантиях – на любой вход «объема» n алгоритм затратит не более чем T(n) времени.
§ Время работы на самых хороших входах видимо мало чего говорит о самой задаче. Обычно разные программы решения одной и той же задачи показывают наилучшее время на разных входах, и в этих случаях более или менее ясно, как переориентировать программу с одних наилучших входов на другие без существенного изменения существа программы.
Но имеются впечатляющие примеры, когда программа, очень плохо работающая на некоторых входах, хорошо показывает себя на реальных задачах. Например, о симплекс-методе решения задачи линейного программирования известно: на плохих входах этот алгоритм затрачивает экспоненциальное время, но на реальных задачах устойчиво показывает намного лучшее время. Причиной
такого расхождения видимо является то обстоятельство, что плохие входы составляют очень малую долю во множестве всех возможных входов, по крайней мере с учетом частоты, с которой различные входы встречаются в реальных задачах 11.
Другой вариант трактовать функцию T(n) – как время работы в среднем по всем входам «объема» n. При таком определении T(n) оценка дает меньше гарантий - может поступить вход, на котором программа будет работать дольше чем T(n). Но зато такая оценка будет более реалистичной, если конечно базовое распределение вероятностей входов действительно реалистично соответствует практике
применения программы.
Специфическим вариантом времени в среднем является амортизированное время. При амортизационном анализе (amortized analysis) время, требуемое для выполнения последовательности операций над структурой данных, усредняется по всем выполняемым операциям. Этот анализ можно использовать, например, чтобы показать, что даже если одна из операций последовательности является
дорогостоящей, то при усреднении по всей последовательности средняя стоимость операций будет небольшой. При амортизационном анализе гарантируется средняя производительность операций в наихудшем случае, но с усреднением по последовательностям (допустимых) операций.