В теоретической информатике временная сложность — это вычислительная сложность , которая описывает количество компьютерного времени, необходимое для запуска алгоритма . Временная сложность обычно оценивается путем подсчета количества элементарных операций, выполняемых алгоритмом, при условии, что выполнение каждой элементарной операции занимает фиксированное количество времени. Таким образом, количество затраченного времени и количество элементарных операций, выполняемых алгоритмом, считаются связанными постоянным коэффициентом .
Поскольку время работы алгоритма может различаться для разных входных данных одного и того же размера, обычно рассматривают временную сложность наихудшего случая , которая представляет собой максимальное количество времени, необходимое для входных данных заданного размера. Менее распространенным и обычно указываемым явно является сложность среднего случая , которая представляет собой среднее время, затраченное на входные данные заданного размера (это имеет смысл, поскольку существует только конечное число возможных входных данных заданного размера). В обоих случаях временная сложность обычно выражается как функция размера входных данных. [1] : 226 Поскольку эту функцию обычно трудно вычислить точно, а время выполнения для небольших входных данных обычно не имеет существенного значения, обычно фокусируются на поведении сложности при увеличении размера входных данных, то есть на асимптотическом поведении сложность. Таким образом, временная сложность обычно выражается с использованием обозначения большого О , обычно , , , и т. д., где n — размер в битах , необходимый для представления входных данных.
Алгоритмические сложности классифицируются в зависимости от типа функции, обозначаемой большой буквой О. Например, алгоритм с временной сложностью — это алгоритм с линейным временем , а алгоритм с временной сложностью для некоторой константы — это алгоритм с полиномиальным временем .
В следующей таблице приведены некоторые классы часто встречающихся временных сложностей. В таблице poly( x ) = x O (1) , т. е. полиномиально по x .
Говорят, что алгоритм имеет постоянное время (также записываемое как время), если значение (сложность алгоритма) ограничено значением, которое не зависит от размера входных данных. Например, доступ к любому отдельному элементу массива занимает постоянное время, поскольку для его обнаружения необходимо выполнить только одну операцию . Аналогичным образом находим минимальное значение в массиве, отсортированном по возрастанию; это первый элемент. Однако поиск минимального значения в неупорядоченном массиве не является операцией с постоянным временем, поскольку для определения минимального значения необходимо сканирование каждого элемента массива. Следовательно, это операция линейного времени, требующая времени. Однако, если количество элементов известно заранее и не меняется, можно сказать, что такой алгоритм работает за постоянное время.
Несмотря на название «постоянное время», время работы не обязательно должно быть независимым от размера задачи, но верхняя граница времени работы должна быть независимой от размера задачи. Например, задача «обменять значения a и b , если необходимо, чтобы » называется постоянным временем, хотя время может зависеть от того, верно ли уже, что . Однако существует некоторая константа t , такая, что требуемое время всегда не превышает t .
Говорят, что алгоритм требует логарифмического времени, когда . Поскольку и связаны постоянным множителем , а такой множитель не имеет отношения к классификации большого O, стандартное использование алгоритмов логарифмического времени не зависит от основания логарифма, появляющегося в выражении T .
Алгоритмы, использующие логарифмическое время, обычно встречаются при операциях с двоичными деревьями или при использовании двоичного поиска .
Алгоритм считается высокоэффективным, поскольку отношение количества операций к размеру входных данных уменьшается и стремится к нулю при увеличении n . Алгоритм, который должен получить доступ ко всем элементам своих входных данных, не может требовать логарифмического времени, поскольку время, необходимое для чтения входных данных размера n , имеет порядок n .
Пример логарифмического времени дается поиском по словарю. Рассмотрим словарь D , который содержит n записей, отсортированных по алфавиту . Мы предполагаем, что при можно получить доступ к k- й записи словаря за постоянное время. Обозначим эту k- ю запись. Согласно этим гипотезам, проверка наличия слова 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 поли( n ) , где поли( n ) — некоторый полином от n . Более формально, алгоритм является экспоненциальным по времени, если T ( n ) ограничен O (2 n k ) для некоторой постоянной k . Проблемы, которые допускают алгоритмы экспоненциального времени на детерминированной машине Тьюринга, образуют класс сложности, известный как EXP .
Иногда экспоненциальное время используется для обозначения алгоритмов, которые имеют T ( n ) = 2 O ( n ) , где показатель степени является не более чем линейной функцией от n . Это приводит к классу сложности E.
Алгоритм называется факториальным по времени , если T(n) ограничен сверху факториальной функцией n! . Факториальное время является подмножеством экспоненциального времени (EXP), поскольку для всех . Однако это не подмножество E.
Примером алгоритма, работающего за факторное время, является bogosort , заведомо неэффективный алгоритм сортировки, основанный на методе проб и ошибок . Bogosort сортирует список из n элементов, неоднократно перемешивая список, пока не будет обнаружено, что он отсортирован. В среднем при каждом проходе алгоритма bogosort проверяется один из n ! упорядочение n предметов . Если элементы различны, сортируется только один такой порядок. Богосорт разделяет наследие теоремы о бесконечных обезьянах .
Алгоритм называется двойным экспоненциальным временем, если T ( n ) ограничен сверху 2 2 поли( n ) , где поли( n ) — некоторый полином от n . Такие алгоритмы относятся к классу сложности 2-EXPTIME .
Хорошо известные алгоритмы двойной экспоненциальной времени включают в себя:
{{cite book}}
: CS1 maint: date and year (link) CS1 maint: multiple names: authors list (link){{cite journal}}
: Требуется цитировать журнал |journal=
( помощь )