Сложность алгоритмов
(расширяемое эссе)

1

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

:

При рассмотрении со сложностной точки зрения некоторого алгоритма предполагается, что на его возможных входах определена неотрицательная целочисленная функция , называемая размером входа, и целочисленные неотрицательные функции ,   временны́х и пространственных затрат (пространственные затраты называют также затратами памяти).

:

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

Областью изменения как аргумента функций и является множество значений размера .

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

T

2

:

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

:

Для любого алгоритма при любом распределении вероятностей на множестве , сложность в среднем не превосходит сложности в худшем случае: , .

Если алгоритм применяется многократно к входам данного размера, то можно ожидать, что среднее арифметическое затрат будет близко к сложности в среднем нашего алгоритма. Но при этом предполагается, что входам данного размера адекватно сопоставлены некоторые вероятности, а для такого предположения должны быть достаточные основания (типичное допущение, что все входы каждого размера равновероятны, в конкретной ситуации может оказаться безосновательным).

[ ]

T

3

+

Итак, сложность алгоритма как в худшем случае, так и в среднем есть функция числового аргумента — размера входа. Для исследования роста сложности конкретного алгоритма при возрастании размера входа часто используются асимптотические оценки вида

Первая из них — верхняя асимптотическая оценка, вторая — нижняя асимптотическая оценка. Третья оценка объединяет в себе первые две, выражаемое ею отношение можно высказать словами “ есть величина порядка ”, или “ и имеют одинаковый порядок”.

+

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

[ ]

T

4

:

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

:

Битовая  временная сложность получается при рассмотрении числа битовых операций в качестве функции затрат. Аналогично могут быть определены пространственные алгебраическая и соответственно битовая сложности по числу величин рассматриваемого типа.

T

5

+

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

+

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

Мы уже говорили о том, что сложность в среднем “обычного” (детерминированного) алгоритма представляет интерес только в том случае, если правильны предположения о вероятности появления того или иного входа. Рассматриваемая нами сложность рандомизированных алгоритмов — это сложность в худшем случае, но она определяется на основе усредненных затрат. Эта усредненность заслуживает полного доверия, так как рандомизированные алгоритмы используют генераторы случайных чисел, в которых распределение вероятностей фиксировано и не зависит от входов.

[ ]

T

6

В теории сложности исходят из некоторой гипотетической модели вычислительного устройства (“модели вычислений”).

+

Иногда в качестве такой модели выбирается машина с равнодоступными ячейками памяти (“равнодоступная адресная машина” — РАМ). В других случаях — машина Тьюринга.

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

Мы будем ориентироваться на модель РАМ. Предположение, что на объем ячейки нет ограничений, приводит к алгебраической сложности, а предположение, что в ячейке хранится один бит, — к временной или пространственной битовой сложности.

7

[ ]

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

Мы обсуждаем только вычислительную сложность, и будем продолжать называть ее просто сложностью.

8

+

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

+

Если минимальная функция в этом семействе существует, то соответствующий ей алгоритм — оптимальный в рассматриваемом классе алгоритмов.

T

9

:

Оптимальные в заданном классе алгоритмы известны не всегда. Возможно также, что в классе просто нет оптимального алгоритма, т.е. алгоритма, сложность которого является нижней границей для сложностей алгоритмов данного класса.

:

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

:

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

+

В частности, остается много неясного относительно полиномиальных алгоритмов для задач распознавания, где ответ — это одно из слов “да”, “нет” или же одно из чисел 1, 0 и т.д. Здесь упомянем получившую известность проблему P≟NP.

T

10

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

+

Рассмотрение линейной сводимости позволяет придать точный смысл словам, что одна вычислительная задача не сложнее другой.

+

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

T

11

:

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

T