Основы анализа эффективности алоритмов.ppt
- Количество слайдов: 20
Основы анализа эффективности алоритмов
• В этом разделе мы познакомимся с основными понятиями, использующимся для анализа эффективности алгоритмов. Начнем с рассмотрения двух видов эффективности: временной и пространственной. • Временная эффективность (time • efficiency) является индикатором скорости работы алгоритма. • Пространственная эффективность (space efficiency) показывает, сколько дополнительной оперативной памяти нужно для работы алгоритма.
1. Оценка размера входных данных • Начнем обсуждение с констатации очевидного факта, что время выполнения большинства алгоритмов напрямую зависит от размера вводимых данных (т. е. чем больше размер, тем дольше работает алгоритм). • Например, довольно долго длится процесс сортировки больших массивов данных, перемножения больших матриц и т. п. Поэтому вполне логично описать эффективность алгоритма в виде функции от некоторого параметра n, связанного с размером входных данных. • В большинстве случаев выбрать такой параметр не представляет большого труда. Например, для задач, связанных с сортировкой, поиском, нахождением наименьшего элемента в списке и многих других, связанных с обработкой списков, таким параметром будет размер списка.
• Можно сделать специальное замечание по поводу оценки размера входных данных для алгоритмов, связанных с нахождением чисел, удовлетворяющих определенным условиям (например, проверяющих, является ли заданное целое число n простым). • Для подобных алгоритмов кибернетики предпочитают оценивать размер входных данных по количеству битов b в двоичном представлении числа n: • b = log 2 n + 1 • Подобная система измерений позволяет лучше оценить эффективность рассматриваемого алгоритма.
2. Единицы измерения времени выполнения алгоритма • Один из возможных способов решения этой проблемы состоит в подсчете того, сколько раз выполняется каждая операция алгоритма. Однако подобный подход слишком сложен и чаще всего не нужен. Поэтому необходимо составить список наиболее важных операций, выполняемых в алгоритме, называемых основными, или базовыми операциями (basic operation), определить, какие из них вносят наибольший вклад в общее время выполнения алгоритма, и вычислить, сколько раз эти операции выполняются. • Составить список основных операций алгоритма совсем нетрудно. Обычно в него включают наиболее длительные по времени операции, выполняемые во внутреннем цикле алгоритма. • Например, в большинстве алгоритмов сортировки используется метод сравнения двух элементов (ключей) списка, который сортируется. Для подобного типа алгоритмов основной является операция сравнения ключей. • В качестве еще одного примера рассмотрим алгоритмы перемножения матриц и вычисления значения многочлена. В них используются две основные операции: умножение и сложение.
• Таким образом, закладывая основу для анализа временной эффективности алгоритмов, мы предполагаем, что этот показатель будет оцениваться по количеству основных операций, которые должен выполнить алгоритм при обработке входных данных размера n.
3. Эффективность алгоритма в разных случаях • В начале мы определили, что имеет смысл оценивать эффективность алгоритма как функцию от некоторого параметра n, связанного с размером входных данных. • Однако существует большое количество алгоритмов, время выполнения которых зависит не только от размера входных данных, но также и от особенностей конкретных входных данных. • В качестве примера рассмотрим задачу последовательного поиска. Она решается с помощью довольно простого алгоритма, который выполняет поиск заданного элемента (ключа поиска K) в списке, состоящем из n элементов, путем последовательного сравнения ключа K с каждым из элементов списка. • Работа алгоритма завершается, либо когда заданный ключ найден, либо когда весь список исчерпан.
• Совершенно очевидно, что время работы этого алгоритма может отличаться в очень широких пределах для одного и того же списка размера n. В наихудшем случае, т. е. когда в списке нет искомого элемента либо когда искомый элемент расположен в списке последним, в алгоритме будет выполнено наибольшее количество операций сравнения ключа со всеми n элементами списка.
Определение 1 • Под эффективностью алгоритма в наихудшем случае (worst-case efficiency) подразумевают его эффективность для наихудшей совокупности входных данных размером n, т. е. для такой совокупности входных данных размером n среди всех возможных, для которой время работы алгоритма будет наибольшим.
Опрделение 2 • Под эффективностью алгоритма в наилучшем случае (best-case efficiency) подразумевают его эффективность для наилучшей совокупности входных данных размером n, т. е. для такой совокупности входных данных размером n среди всех возможных, для которой время работы алгоритма будет наименьшим.
Определение 3 • Существует еще один вид эффективности, называемый амортизированной эффективностью (amortized efficiency). • Она предназначена не столько для анализа общего времени выполнения алгоритма, сколько для анализа последовательности операций, выполняемых над одной и той же структурой данных.
Выводы • 1) И временная, и пространственная эффективности оцениваются в виде функции от некоторого параметра n, связанного с размером входных данных. • 2) Временная эффективность измеряется путем подсчета числа основных операций, выполняемых в алгоритме. Пространственная эффективность оценивается в виде количества дополнительных единиц памяти, требуемых для работы алгоритма. • 3) Эффективность отдельных алгоритмов может различаться в очень широких пределах для разных наборов входных данных одинакового размера. Поэтому эффективность таких алгоритмов оценивают для наихудшего, наилучшего и типичного набора входных данных. • 4) Основной целью анализа эффективности алгоритмов является определение порядка роста времени выполнения алгоритма (а также количества дополнительных единиц памяти) в случае, когда размер входных данных стремится к бесконечности.
Основные классы эффективности • 1) Константа • Если не считать эффективности в наилучшем случае, в этот класс попадает очень небольшое количество алгоритмов. Обычно при бесконечном увеличении размера входных данных время выполнения алгоритма также стремится к бесконечности
• 2) log n Логарифмическая • Обычно такая зависимость появляется в результате сокращения размера задачи на постоянное значение на каждом шаге итерации алгоритма. • В логарифмическом алгоритме невозможна работа со всеми входными данными (и даже с их некоторой фиксированной частью). В этом случае время выполнения любого алгоритма будет находиться по меньшей мере в линейной зависимости от размера входных данных
• 3) n Линейная • К этому классу относятся алгоритмы, выполняющие сканирование списка, состоящего из n элементов, например алгоритм поиска методом последовательного перебора.
• 4) n log n n-log-n • К этому классу относятся большое количество алгоритмов декомпозиции, таких как алгоритмы сортировки слиянием и быстрой сортировки
• 5) n 2 Квадратичная • Как правило, подобная зависимость характеризует эффективность алгоритмов, содержащих два встроенных цикла. • В качестве типичных примеров достаточно назвать простой алгоритм сортировки и целый ряд операций, выполняемых над матрицами размером n. Хn.
• 6)n 3 Кубическая • Как правило, подобная зависимость характеризует эффективность алгоритмов, содержащих три встроенных цикла (см. следующий раздел). К этому классу относятся несколько довольно сложных алгоритмов линейной алгебры
• 7)2 n Экспоненциальная • Данная зависимость типична для алгоритмов, выполняющих обработку всех подмножеств некоторого множества, состоящего из n элементов. • Часто термин “экспоненциальный” используется в широком смысле и означает очень высокие порядки роста, т. е. включает более быстрые по сравнению с экспонентой порядки роста
• 8)n! Факториальная • Данная зависимость типична для алгоритмов, выполняющих обработку всех перестановок некоторого множества, состоящего из n элементов