Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты на зачет.docx
Скачиваний:
51
Добавлен:
01.06.2015
Размер:
554.66 Кб
Скачать

19. Классификация алгоритмов

    1. Классификация Алгоритмов

Как было замечено ранее, большинство алгоритмов имеют некую характеристику N, обычно это количество подлежащих обработке данных, хотя числоNможет быть степенью полинома, размером сортируемого файла или количеством узлов в графе. Практически все из алгоритмов, которые мы с вами рассмотрим, имеют время работы пропорциональное одной из нижеследующих функций:

1

Большинство операций в программе выполняются только раз или только несколько раз. Если все инструкции программы имеют такое свойство, то мы будем говорить, что время работы программы константа.

1

Когда время работы программы логарифмическое, программа начинает работать немного медленнее с увеличением N. Такое время работы встречается обычно в программах, которые делят большую проблему на маленькие, и решают их по отдельности.

Время работы программы обычно линейно, когда каждый элемент входных данных требуется обработать лишь линейное число раз.

Такое время работы имеют те алгоритмы, которые делят большую проблему в маленькие, а затем, решив их, соединяют их решения.

Когда время работы алгоритма квадратичное, то такой алгоритм применим только для небольших задач. Такие алгоритмы обычно используются для решения задач связанных с перебором всевозможных пар элементов входных данных.

Аналогично это время работы возникает в алгоритмах перебирающих все возможные тройки элементов.

Небольшое количество алгоритмов имеют экспоненциальное время работы. Такие алгоритмы чаще всего возникают в результате подхода именуемого метод грубой силы.

Время работы конкретной программы почти всегда можно выразить как комбинацию вышеуказанных функций. Коэффициент при функции зависит от количества инструкций в цикле. Для большого числа N главный член комбинации доминирует над всеми остальными. При N не столь больших, активную роль могут начать играть другие члены, и сравнение алгоритмов становится затрудненным. В большинстве же случаев мы просто говорим, что время работы программы линейное, квадратичное и т.д.

Иногда могут возникать некоторые другие функции. Например, время от времени могут встречаться илии т.д.

Еще одно замечание по поводу функции log. Легко заметно, что основание логарифма не играет особой роли: оно может внести изменения, но они будут состоять только в изменении сомножителя. Таким образом, нас будет мало волновать каково основание логарифма, и при написании мы будем считать, что используется основание 2.

Одним из подходов к изучению эффективности алгоритма является изучение худшего случая, игнорируя постоянные сомножители, с целью определить функциональную зависимость времени работы от входных данных. Этот подход привлекает тем, что позволяет доказать точные математические утверждения о времени работы программ: например, сортировка слиянием, которую мы рассмотрим позднее, гарантировано имеет время работы пропорциональное.

Другой подход к изучению возможностей алгоритма это изучение среднего случая.Под средним случаем мы понимаем нормально распределенный набор входных данных. Существует по крайне мере три различных проблемы связанные с решением этой задачи.

Первое, на некоторых компьютерах бывает очень трудно определить время выполнения той или иной инструкции. Хуже того, очень часто это время не постоянно и огромное количество расчетов произведенных для одного компьютера может быть неприменимо для другого. Этот самый случай и обходится посредством разбиения алгоритма на составляющие его операции.

Второе, анализ среднего случая является подчас очень сложной математической проблемой и требует детального изучения. Для многих алгоритмов время работы на среднем случае вообще не определено.

Третье, и наиболее существенное – это то, что входные данные могут быть неаккуратно эмулированы или их вообще невозможно описать. Например, как можно описать входные данные к программе обрабатывающей русский текст?

Очень часто результаты математического анализа не точны, а приближенны. В самом деле, если полученное нами выражение состоит из уменьшающихся членов, то нам в основном интересен самый главный ее член.

Например, если мы определили, что некий алгоритм содержит главный внутренний цикл, повторяющийся в среднем раз, внешний цикл, повторяющийся N раз, и код инициализации выполняющийся только раз. Тогда среднее время работы программы будет иметь следующий вид:

Но тогда верно и то, что время работы имеет вид:

Иногда, когда первый член асимптотически большой по сравнению со всеми остальными, нас вообще не интересуют остальные члены, и мы будем говорить, что алгоритм имеет время выполнения около , имея ввиду "".

Как мы увидим в дальнейшем, многие алгоритмы построены на принципе деления одной большой задачи в несколько маленьких. Время работы таких программ зависит от количества подзадач и времени затрачиваемого на разделение.

Ниже приведены основные рекурентности такого рода.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]