![]() |
Оценка эффективности и быстродействия различных алгоритмов.
Существует множество способов решения определенной задачи (класса задач). Это множество порождает обилие алгоритмов, которые ее решают. Однако из этого набора алгоритмов можно выбрать те, которые справляются с поставленной задачей (классом задач) быстрее остальных, используя меньше ресурсов процессора и /или оперативной памяти.
Цель данного топика: рассмотреть как можно больше алгоритмов, оценить их временную сложность и определить границы эффективного применения. Границы эффективного применения – класс задач, для которого рассматриваемый алгоритм будет наиболее быстродейственным. В качестве примера рассмотрим алгоритм сортировки массива методом вставки. Помимо этого я покажу как лучше оформлять сообщение, содержащее обзор алгоритма. Сортировка массива методом вставки. 1. Псевдокод (справка: _http://ru.wikipedia.org/wiki/Псевдокод_(язык_описания_ал горитмов)), описывающий рассматриваемый алгоритм. Код:
InsertionSort(list, N)Временная сложность - скорость увеличения числа операций при возрастании размерности задачи. Например, пусть алгоритм содержит внешний цикл C1 с числом операций N1 и внутренний цикл C2 с числом операций N2, тогда временная сложность определяется следующим образом: Код:
T(N) = C1 * N1 * C2 * N2 ~= С1 * С2 * (N^2) = O (N^2).Применим формулу к рассматриваемому алгоритму. В лучшем случае (когда элементы массива уже упорядочены: [1, 2, 3, 4]): Код:
T(N) = O (N).Код:
T(N) = O ((N^2)/4).Алгоритм сортировки методом вставки является наиболее быстродейственным для небольших массивов, с высокой степенью начальной упорядоченности. |
Сортировка массива методом перестановки. Дан массив из n чисел, отсортировать его по возврастанию.Решение: Будем генерировать все возможные перестановки из n элементов. Среди всех возможных перестановок из n эл., существует такая в которой элементы расставлены в неубывающем порядке. Завершаем алгоритм. Временная сложность. В худшем случае требуется перебрать n! перестановок. Вывод. Более неэффективного алгоритма сортировки не существует. ----------------------- 2ErrorNeo Предложенный тобой алгоритм не решает задачу сортировки массива, т.к. он не всюду применим(он может не отсортировать данный массив за конечное время, т.е. мы не узнаем работает алгоритм или нет =) ) |
Цитата:
можно генерировать рандомные варианты перестановок из n эл. до тех пор, пока массив не окажется упорядоченным. Если повезет - такой метод перестановки отработает всю сортировку за 1 перестановку. Если нет- решение может занять намного дольше твоего метода, т.к. каждая новая попытка в данном случае не увеличивает вероятности "успешного попадания". А вообще самый быстрый из существующих методов сортировки массивов называется "quicksort" http://ru.wikipedia.org/wiki/Быстрая_сортировка метод описанный в первом посте - http://ru.wikipedia.org/wiki/Сортировка_вставками |
Цитата:
У пирамидальной сортировки в любом случае (тоесть и в лучшем, и в худшем, и в среднем) O(N*log N). Так же существует еще и поразрядная сортировка, которая вообще линейна... |
Сортировка методом "пузырька".
1. Псевдокод.
Код:
NOF = N;В лучшем случае (все элементы уже упорядоченны): Код:
T(n) = O(N)Код:
T(n) = (N - 1) + (N - 2) + ... + 1= O(N^2)Простой алгоритм сортировки, эффективный для небольших массивов, однако, прост для понимания и легок для реализации. |
Сортировка простым выбором.
1. Псевдокод
Код:
varНа массиве из n элементов имеет время выполнения в худшем, среднем и лучшем случае: Код:
T(n) = O(N^2)3. Вывод. Неустойчивый алгоритм сортировки, обладающий одинаковым временем сортировки для небольших массивов разной степени упорядоченности, что делает его наиболее универсальным в своем классе. |
Сортировка Шелла.
1. Псевдокод.
Код:
ShellSort(list, N)В худшем случае: Код:
T(n) = O(N^(3/2))Невзирая на то, что сортировка Шелла во многих случаях медленнее, чем быстрая сортировка, она имеет ряд преимуществ: -отсутствие потребности в памяти под стек -отсутствие деградации при неудачных наборах данных — qsort легко деградирует до O(N^2), что хуже, чем худшее гарантированное время для сортировки Шелла Часто оказывается, что сортировка Шелла есть самый лучший способ сортировки до, примерно, 1000 элементов. (с) Wikipedia |
как же вы надоели со своими квадратичными (да и вообще) сортировками!
Кому очень интересно узнать всё в детелях и подробностях, вникнуть во все реккуренты - добро пожаловать, у Кнута целый том. Плюс жалкие намёки на оценку сложности. Ну в худшем случае O(g(n)). И что? Где средние оценки времени?? Где оценки, например, среднего количества обменов элементов? |
Цитата:
Цитата:
Цитата:
P.S. Спасибо за замечания. |
>>книга насыщена математическими выкладками
А что же такое "анализ алгоритмов" без математики? и не надо аппелировать к термину "класс задач" - у него немного другой смысл. |
| Время: 13:47 |