![]() |
Оценка эффективности и быстродействия различных алгоритмов.
Существует множество способов решения определенной задачи (класса задач). Это множество порождает обилие алгоритмов, которые ее решают. Однако из этого набора алгоритмов можно выбрать те, которые справляются с поставленной задачей (классом задач) быстрее остальных, используя меньше ресурсов процессора и /или оперативной памяти.
Цель данного топика: рассмотреть как можно больше алгоритмов, оценить их временную сложность и определить границы эффективного применения. Границы эффективного применения – класс задач, для которого рассматриваемый алгоритм будет наиболее быстродейственным. В качестве примера рассмотрим алгоритм сортировки массива методом вставки. Помимо этого я покажу как лучше оформлять сообщение, содержащее обзор алгоритма. Сортировка массива методом вставки. 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. Спасибо за замечания. |
>>книга насыщена математическими выкладками
А что же такое "анализ алгоритмов" без математики? и не надо аппелировать к термину "класс задач" - у него немного другой смысл. |
Цитата:
Прошу Вас дать свой вариант определения "класса задач", чтобы заполнить пробел. |
Цитата:
|
под классом задач обычно понимают http://ru.wikipedia.org/wiki/Класс_сложности
>>достаточно написать конечные результаты и сделать по ним выводы. так напиши полезные результаты (а не пузырёк), и полные выводы. Например, сколько в среднем (по всем входным массивам) работает тот же пузырёк, и сколько обменов он совершает в среднем? |
Цитата:
Цитата:
Я понимаю что метрика "среднего случая" для Вас крайне важна, но не настолько, чтобы она стояла по приоритетам выше "худший случай" и "лучший случай", которых вполне достаточно для сравнения алгоритмов по эффективности. |
>>где в своих постах я использовал данный термин не "по назначению".
Цитата:
тут под классом задач, как я понимаю, имеется в виду "похожие по смыслу задачи". А, например, для похожих по смыслу задач проверки числа на простоту (невероятностного) и разложения на множители, первая имеет быстрое решение (логарифм числа в какой-то степени), а про вторую существование быстрого решения неизвестно. >>которых вполне достаточно для сравнения алгоритмов по эффективности. недостаточно. Вот почему, по-вашему, так часто пишут qsort, хотя худший случай это N^2, а не merge - с N log N ? А потому что, очень часто (читай - на случайном входе) быстродействие первого оказывается не хуже второго, а часто - лучше. |
Цитата:
А о сортировках из вашего примера (быстрой и слиянием) автор еще не упоминал, и я уверен, что когда он это сделает, то мы увидим оценку их временной сложности в среднем случае ;) |
Кнута не читал и пока не собираюсь.
Эта статья интерсна, и чем больше в ней ставрительных характеристик тем лучше. Если будут выкладки из чего-либо кроме википедии - будет вообще perfect;) |
Цитата:
Цитата:
Цитата:
|
Циклический сдвиг элементов массива вправо на k позиций
Цитата:
Циклический сдвиг элементов массива вправо на k позиций 1) Код: Код:
template <typename MassiveType>Не используется выделение больших объемов дополнительной памяти. 3) Временная сложность: Во всех случаях Т(n) = О(N) |
| Время: 02:50 |