В теоретической информатике временная сложность — это вычислительная сложность , которая описывает количество машинного времени, которое требуется для выполнения алгоритма . Временная сложность обычно оценивается путем подсчета количества элементарных операций, выполняемых алгоритмом, предполагая, что каждая элементарная операция занимает фиксированное количество времени для выполнения. Таким образом, количество затраченного времени и количество элементарных операций, выполняемых алгоритмом, считаются связанными постоянным коэффициентом .
Поскольку время выполнения алгоритма может различаться для разных входных данных одинакового размера, обычно рассматривают сложность в худшем случае , которая является максимальным количеством времени, требуемым для входных данных заданного размера. Менее распространенной и обычно указываемой явно является сложность в среднем случае , которая является средним значением времени, требуемого для входных данных заданного размера (это имеет смысл, поскольку существует только конечное число возможных входных данных заданного размера). В обоих случаях сложность в основном выражается как функция размера входных данных. [1] : 226 Поскольку эту функцию обычно трудно вычислить точно, а время выполнения для небольших входных данных обычно не имеет значения, обычно фокусируются на поведении сложности при увеличении размера входных данных, то есть на асимптотическом поведении сложности. Поэтому сложность в основном выражается с использованием нотации O-большое , как правило , , , , и т. д., где n — размер в единицах бит, необходимый для представления входных данных.
Алгоритмические сложности классифицируются в соответствии с типом функции, появляющейся в большой нотации O. Например, алгоритм с временной сложностью является линейным алгоритмом , а алгоритм с временной сложностью для некоторой константы является полиномиальным алгоритмом .
В следующей таблице суммированы некоторые классы часто встречающихся временных сложностей. В таблице poly( x ) = x O (1) , т.е. полином по x .
Говорят, что алгоритм выполняется за постоянное время (также пишется как время), если значение (сложность алгоритма) ограничено значением, которое не зависит от размера входных данных. Например, доступ к любому отдельному элементу в массиве занимает постоянное время, так как для его нахождения требуется выполнить только одну операцию . Аналогичным образом, поиск минимального значения в массиве, отсортированном по возрастанию; это первый элемент. Однако поиск минимального значения в неупорядоченном массиве не является операцией с постоянным временем, так как для определения минимального значения необходимо сканирование каждого элемента в массиве. Следовательно, это линейная по времени операция, требующая времени. Однако, если количество элементов известно заранее и не меняется, такой алгоритм все равно можно считать работающим за постоянное время.
Несмотря на название «постоянное время», время выполнения не обязательно должно быть независимым от размера проблемы, но верхняя граница времени выполнения должна быть независимой от размера проблемы. Например, задача «поменять значения a и b , если необходимо, так, чтобы » называется постоянным временем, даже если время может зависеть от того, верно ли уже, что . Однако существует некоторая константа t, такая, что требуемое время всегда не превышает t .
Говорят, что алгоритм занимает логарифмическое время , когда . Поскольку и связаны постоянным множителем , а такой множитель не имеет значения для классификации O-большое, стандартное использование алгоритмов с логарифмическим временем не зависит от основания логарифма, появляющегося в выражении T .
Алгоритмы, требующие логарифмического времени, обычно встречаются в операциях с двоичными деревьями или при использовании бинарного поиска .
Алгоритм считается высокоэффективным, поскольку отношение числа операций к размеру ввода уменьшается и стремится к нулю при увеличении n . Алгоритм, который должен получить доступ ко всем элементам своего ввода, не может выполняться за логарифмическое время, поскольку время, необходимое для чтения ввода размера n, имеет порядок n .
Примером логарифмического времени является поиск по словарю. Рассмотрим словарь D , содержащий n записей, отсортированных в алфавитном порядке . Мы предполагаем, что для можно получить доступ к k -й записи словаря за постоянное время. Пусть обозначает эту k -ю запись. При этих гипотезах тест на наличие слова w в словаре может быть выполнен за логарифмическое время: рассмотрим , где обозначает функцию пола . Если --то есть слово w находится точно в середине словаря -- то мы закончили. В противном случае, если --то есть, если слово w находится раньше в алфавитном порядке, чем среднее слово всего словаря -- мы продолжаем поиск таким же образом в левой (то есть более ранней) половине словаря, а затем снова многократно, пока не будет найдено правильное слово. В противном случае, если оно находится после среднего слова, продолжаем аналогично с правой половиной словаря. Этот алгоритм похож на метод, часто используемый для поиска записи в бумажном словаре. В результате пространство поиска в словаре уменьшается по мере приближения алгоритма к целевому слову.
Говорят, что алгоритм работает за полилогарифмическое время , если его время равно некоторой константе k . Другой способ записать это : .
Например, упорядочение цепочки матриц может быть решено за полилогарифмическое время на параллельной машине с произвольным доступом [7] , а граф может быть определен как плоский полностью динамическим способом за время на операцию вставки/удаления. [8]
Говорят, что алгоритм работает за сублинейное время (часто пишется как сублинейное время ), если . В частности, сюда входят алгоритмы с временной сложностью, определенной выше.
Конкретный термин «алгоритм сублинейного времени» обычно относится к рандомизированным алгоритмам, которые выбирают небольшую часть своих входных данных и эффективно обрабатывают их, чтобы приблизительно вывести свойства всего экземпляра. [9] Этот тип алгоритма сублинейного времени тесно связан с проверкой свойств и статистикой .
Другие параметры, в которых алгоритмы могут работать за сублинейное время, включают:
Говорят, что алгоритм занимает линейное время или время, если его временная сложность равна . Неформально это означает, что время выполнения увеличивается не более чем линейно с размером входных данных. Точнее, это означает, что существует константа c такая, что время выполнения не более чем для каждого входного данных размера n . Например, процедура, которая складывает все элементы списка, требует времени, пропорционального длине списка, если время сложения является постоянным или, по крайней мере, ограничено константой.
Линейное время — это наилучшая возможная временная сложность в ситуациях, когда алгоритм должен последовательно считывать все свои входные данные. Поэтому много исследований было вложено в обнаружение алгоритмов, демонстрирующих линейное время или, по крайней мере, почти линейное время. Это исследование включает как программные, так и аппаратные методы. Существует несколько аппаратных технологий, которые используют параллелизм для обеспечения этого. Примером является адресуемая по содержимому память . Эта концепция линейного времени используется в алгоритмах сопоставления строк, таких как алгоритм поиска строк Бойера–Мура и алгоритм Укконена .
Говорят, что алгоритм работает за квазилинейное время (также называемое логарифмически линейным временем ), если для некоторой положительной константы k ; [11] имеет место линейное время . [12] При использовании мягкой нотации O эти алгоритмы являются . Квазилинейные алгоритмы времени также работают для каждой константы и, таким образом, работают быстрее, чем любой полиномиальный алгоритм времени, временная граница которого включает член для любого .
Алгоритмы, работающие за квазилинейное время, включают:
Во многих случаях время выполнения — это просто результат выполнения операции n раз (для обозначения см. нотацию Big O § Семейство нотаций Бахмана–Ландау ). Например, сортировка двоичного дерева создает двоичное дерево путем вставки каждого элемента массива размером n по одному. Поскольку операция вставки в самобалансирующемся двоичном дереве поиска занимает время, весь алгоритм также занимает время.
Сортировки сравнения требуют по крайней мере сравнений в худшем случае, поскольку , по приближению Стирлинга . Они также часто возникают из рекуррентного соотношения .
Говорят, что алгоритм имеет субквадратичное время , если .
Например, простые, основанные на сравнении алгоритмы сортировки являются квадратичными (например, сортировка вставкой ), но можно найти более продвинутые алгоритмы, которые являются субквадратичными (например, сортировка оболочки ). Никакие универсальные сортировки не выполняются за линейное время, но переход от квадратичного к субквадратичному имеет большое практическое значение.
Говорят, что алгоритм имеет полиномиальное время , если время его выполнения ограничено сверху полиномиальным выражением от размера входных данных для алгоритма, то есть T ( n ) = O ( n k ) для некоторой положительной константы k . [1] [13] Задачи , для которых существует детерминированный алгоритм с полиномиальным временем, относятся к классу сложности P , который является центральным в области теории вычислительной сложности . Тезис Кобэма гласит, что полиномиальное время является синонимом «выполнимого», «выполнимого», «эффективного» или «быстрого». [14]
Некоторые примеры алгоритмов с полиномиальным временем:
Эти две концепции актуальны только в том случае, если входные данные алгоритмов состоят из целых чисел.
Концепция полиномиального времени приводит к нескольким классам сложности в теории вычислительной сложности. Некоторые важные классы, определенные с использованием полиномиального времени, следующие.
P — наименьший класс временной сложности на детерминированной машине, который устойчив к изменениям модели машины. (Например, замена одноленточной машины Тьюринга на многоленточную машину может привести к квадратичному ускорению, но любой алгоритм, работающий за полиномиальное время в рамках одной модели, работает так же и в рамках другой.) Любая заданная абстрактная машина будет иметь класс сложности, соответствующий задачам, которые могут быть решены за полиномиальное время на этой машине.
Алгоритм определяется как требующий суперполиномиального времени , если T ( n ) не ограничено сверху никаким полиномом. Используя небольшую омега-нотацию , это время ω ( n c ) для всех констант c , где n — входной параметр, обычно число битов на входе.
Например, алгоритм, который выполняется за 2 n шагов на входных данных размера n, требует суперполиномиального времени (точнее, экспоненциального времени).
Алгоритм, использующий экспоненциальные ресурсы, явно является суперполиномиальным, но некоторые алгоритмы являются только очень слабо суперполиномиальными. Например, тест простоты Адлемана–Померанса–Румели выполняется за время n O (log log n ) на n -битных входных данных; он растет быстрее, чем любой полином для достаточно большого n , но размер входных данных должен стать непрактично большим, прежде чем его не сможет доминировать полином с малой степенью.
Алгоритм, требующий суперполиномиального времени, лежит за пределами класса сложности P. Тезис Кобэма утверждает, что эти алгоритмы непрактичны, и во многих случаях это так. Поскольку проблема P против NP не решена, неизвестно, требуют ли NP-полные задачи суперполиномиального времени.
Квазиполиномиальные алгоритмы времени — это алгоритмы, время выполнения которых демонстрирует квазиполиномиальный рост , тип поведения, который может быть медленнее полиномиального времени, но все же значительно быстрее экспоненциального времени . Худшее время выполнения квазиполиномиального алгоритма времени составляет для некоторого фиксированного . Когда это дает полиномиальное время, а для это дает сублинейное время.
Есть некоторые задачи, для которых мы знаем квазиполиномиальные алгоритмы времени, но не известен ни один полиномиальный алгоритм времени. Такие задачи возникают в алгоритмах приближения; известным примером является направленная задача о дереве Штейнера , для которой существует квазиполиномиальный алгоритм времени приближения, достигающий коэффициента приближения ( n — число вершин), но демонстрация существования такого полиномиального алгоритма времени является открытой проблемой.
Другие вычислительные проблемы с квазиполиномиальным временем решения, но без известного полиномиального времени решения, включают задачу о посаженной клике , в которой цель состоит в том, чтобы найти большую клику в объединении клики и случайного графа . Хотя она и является квазиполиномиально разрешимой, было высказано предположение, что задача о посаженной клике не имеет полиномиального времени решения; эта гипотеза о посаженной клике использовалась в качестве предположения о вычислительной сложности для доказательства сложности нескольких других задач в вычислительной теории игр , тестировании свойств и машинном обучении . [15]
Класс сложности QP состоит из всех задач, имеющих квазиполиномиальные алгоритмы времени. Он может быть определен в терминах DTIME следующим образом. [16]
В теории сложности нерешенная проблема P против NP спрашивает, имеют ли все проблемы в NP алгоритмы с полиномиальным временем. Все самые известные алгоритмы для NP-полных задач, такие как 3SAT и т. д., требуют экспоненциального времени. Действительно, предполагается, что для многих естественных NP-полных задач они не имеют алгоритмов с субэкспоненциальным временем. Здесь «субэкспоненциальное время» подразумевает второе определение, представленное ниже. (С другой стороны, многие графовые задачи, представленные естественным образом матрицами смежности, решаются за субэкспоненциальное время просто потому, что размер входных данных равен квадрату числа вершин.) Эта гипотеза (для задачи k-SAT) известна как гипотеза экспоненциального времени . [17] Поскольку предполагается, что NP-полные задачи не имеют квазиполиномиальных алгоритмов времени, некоторые результаты по неаппроксимируемости в области аппроксимационных алгоритмов предполагают, что NP-полные задачи не имеют квазиполиномиальных алгоритмов времени. Например, см. известные результаты по неаппроксимируемости для задачи покрытия множества .
Термин «субэкспоненциальное время » используется для выражения того, что время выполнения некоторого алгоритма может расти быстрее, чем любой полином, но все еще значительно меньше, чем экспоненциальное. В этом смысле проблемы, которые имеют алгоритмы с субэкспоненциальным временем, несколько более поддаются решению, чем те, которые имеют только экспоненциальные алгоритмы. Точное определение «субэкспоненциального» не является общепринятым, [18] однако два наиболее широко используемых приведены ниже.
Говорят, что задача имеет субэкспоненциальное время решения, если она может быть решена за время выполнения, логарифмы которого становятся меньше любого заданного полинома. Точнее, задача имеет субэкспоненциальное время решения, если для каждого ε > 0 существует алгоритм, который решает задачу за время O (2 n ε ). Множество всех таких задач — это класс сложности SUBEXP , который можно определить в терминах DTIME следующим образом. [6] [19] [20] [21]
Это понятие субэкспоненты неоднородно с точки зрения ε в том смысле, что ε не является частью входных данных, и каждое ε может иметь свой собственный алгоритм для решения задачи.
Некоторые авторы определяют субэкспоненциальное время как время выполнения за . [17] [22] [23] Это определение допускает большее время выполнения, чем первое определение субэкспоненциального времени. Примером такого алгоритма субэкспоненциального времени является наиболее известный классический алгоритм для факторизации целых чисел, общее решето числового поля , которое выполняется за время около , где длина входных данных равна n . Другим примером была задача изоморфизма графов , которую наиболее известный алгоритм с 1982 по 2016 год решил в . Однако на STOC 2016 был представлен алгоритм квазиполиномиального времени. [24]
Имеет значение, разрешено ли алгоритму быть субэкспоненциальным по размеру экземпляра, количеству вершин или количеству ребер. В параметризованной сложности эта разница становится явной, если рассматривать пары задач принятия решений и параметров k . SUBEPT — это класс всех параметризованных задач, которые выполняются за время субэкспоненциальное по k и полиномиальное по размеру входных данных n : [25]
Точнее, SUBEPT — это класс всех параметризованных задач , для которых существует вычислимая функция с и алгоритм, который решает L за время .
Экспоненциальная гипотеза времени ( ETH ) заключается в том, что 3SAT , проблема выполнимости булевых формул в конъюнктивной нормальной форме с максимум тремя литералами на предложение и с n переменными, не может быть решена за время 2 o ( n ) . Точнее, гипотеза заключается в том, что существует некоторая абсолютная константа c > 0, такая что 3SAT не может быть решена за время 2 cn никакой детерминированной машиной Тьюринга. Если m обозначает количество предложений, ETH эквивалентна гипотезе о том, что k SAT не может быть решена за время 2 o ( m ) для любого целого числа k ≥ 3 . [26] Экспоненциальная гипотеза времени подразумевает P ≠ NP .
Говорят, что алгоритм имеет экспоненциальное время , если T ( n ) ограничено сверху 2 poly( n ) , где poly( n ) — некоторый полином от n . Более формально, алгоритм имеет экспоненциальное время, если T ( n ) ограничено O (2 n k ) для некоторой константы k . Задачи, которые допускают алгоритмы экспоненциального времени на детерминированной машине Тьюринга, образуют класс сложности, известный как EXP .
Иногда экспоненциальное время используется для обозначения алгоритмов, которые имеют T ( n ) = 2O ( n ) , где показатель степени является не более чем линейной функцией n . Это приводит к классу сложности E.
Говорят, что алгоритм имеет факториальное время , если T(n) ограничено сверху факториальной функцией n! . Факториальное время является подмножеством экспоненциального времени (EXP), поскольку для всех . Однако это не подмножество E.
Примером алгоритма, работающего за факториальное время, является bogosort , печально известный неэффективный алгоритм сортировки, основанный на методе проб и ошибок . Bogosort сортирует список из n элементов, многократно перетасовывая список до тех пор, пока он не будет отсортирован. В среднем случае каждый проход через алгоритм bogosort будет проверять один из n ! упорядочений n элементов. Если элементы различны, сортируется только один такой упорядочение. Bogosort делит наследие с теоремой о бесконечной обезьяне .
Говорят, что алгоритм имеет двойное экспоненциальное время, если T ( n ) ограничено сверху 2 2 poly( n ) , где poly( n ) — некоторый полином от n . Такие алгоритмы относятся к классу сложности 2-EXPTIME .
Известные алгоритмы с двойным экспоненциальным временем включают в себя:
{{cite book}}
: CS1 maint: multiple names: authors list (link){{cite journal}}
: CS1 maint: DOI inactive as of March 2024 (link)