К основному контенту

Скорость роста сложности алгоритма

Быстрорастущие функции доминируют над функциями с более медленным ростом. Поэтому если сложность алгоритма представляет собой сумму двух или нескольких таких функций, то можно отбросить все функции, кроме тех, которые растут быстрее всего. Если, например, алгоритм делает x3-30x сравнений, то его сложность растет как x3. Причина этого в том, что уже при x = 100 входных данных разница между x3 и x3-30x составляет лишь 0,3%.

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

Алгоритмы, сложность которых:

- растёт по крайней мере так же быстро, как данная функция
При занятии эффективностью алгоритмов, класс Ω(f) не представляет большого интереса: например в Ω(n2) входят все функции, растущие быстрее, чем n2, скажем, n3 и 2n.

- растёт с той же скоростью
При сравнении алгоритмов интересны такие, которые решают задачу быстрее, чем уже известные. Поэтому если найденный алгоритм относится к классу Θ, то он не очень интересен.

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

Комментарии

Популярные сообщения из этого блога

Сравнение и арифметические операции

Операции сравнения Все операторы сравнения считаются эквивалентными, и их учитывают в алгоритмах поиска и сортировки. Важным элементом таких алгоритмов является сравнение двух величин для определения (при поиске) того, совпадает ли данная величина с искомой, а при сортировке - вышла ли она за пределы данного интервала. Операторы сравнения проверяют, равна или не равна одна величина другой, меньше они ли больше, меньше или равна, больше или равна. Арифметические операции Аддитивные операции (сложения) Включают в себя сложение, вычитание, увеличение и уменьшение счетчика. Мультипликативные операции (умножения) Включают в себя умножение, деление и взятие остатка по модулю. Умножения работают дольше, чем сложения. На практике некоторые алгоритмы считаются предпочтительнее других, если в них меньше умножений, даже если число сложений при этом пропорционально возрастает. Целочисленное умножение или деление на степень двойки образуют специальный случай. Эта операция ...

Наихудший случай

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

Метод турниров

Метод турниров можно использовать для решения задач, в которых информация, полученная в результате первого прохода по данным, может облегчить последующие проходы. Поиск наибольшего значения Если воспользоваться им для поиска наибольшего значения, то потребуется построение бинарного дерева, все элементы которого являются листьями. На каждом уровне два элемента объединены в пару, причем наибольший из двух элементов копируется в родительский узел. Процесс повторяется до достижения корневого узла. Полное дерево турнира для фиксированного набора данных: Алгоритм поиска второго по величине элемента списка из N значений, требующий около N сравнений В результате каждого сравнения мы получаем "победителя" и "проигравшего". Проигравших мы забываем, и вверх по дереву двигаются только победители. Всякий элемент, за исключением наибольшего, "проигрывает" в точности в одном сравнении. Поэтому для построения дерева турнира требуется N-1 сравнение. Вт...