Введение

Алгоритм, поведение и результат которого могут зависеть от запуска.

В компьютерном программировании недетерминированный алгоритм — это алгоритм, который, даже при одинаковом входном значении, может демонстрировать разное поведение при разных запусках, в отличие от детерминированного алгоритма. Существует несколько причин, по которым алгоритм может вести себя по-разному от запуска к запуску. Параллельный алгоритм может выполняться по-разному из-за возникновения состояния гонки. Поведение вероятностного алгоритма зависит от генератора случайных чисел. Алгоритм, решающий задачу за недетерминированное полиномиальное время, может выполняться за полиномиальное или экспоненциальное время в зависимости от выбора, сделанного в процессе выполнения. Недетерминированные алгоритмы часто используются для поиска приближенного решения, когда точное решение было бы слишком дорогостоящим для получения с помощью детерминированного алгоритма. Данное понятие было введено Робертом В. Флойдом в 1967 году.

Использование

Часто в вычислительной теории термин "алгоритм" относится к детерминированному алгоритму. Недетерминированный алгоритм отличается от более привычного детерминированного аналога своей способностью достигать результатов различными путями. Если детерминированный алгоритм представляет собой единственный путь от входных данных к результату, то недетерминированный алгоритм представляет собой один путь, расходящийся на множество путей, некоторые из которых могут привести к одному и тому же результату, а другие – к уникальным результатам. Это свойство математически отражено в "недетерминированных" моделях вычислений, таких как недетерминированный конечный автомат. В некоторых случаях допускается одновременное выполнение всех возможных путей. При разработке алгоритмов недетерминированные алгоритмы часто используются, когда решаемая ими задача по своей природе допускает несколько возможных результатов (или когда существует единственный результат, к которому можно прийти по множеству равноценных путей). Важно отметить, что любой результат, выдаваемый недетерминированным алгоритмом, является допустимым, независимо от выбора, сделанного алгоритмом в процессе работы. В теории вычислительной сложности недетерминированные алгоритмы – это алгоритмы, которые на каждом шаге могут иметь несколько вариантов продолжения (представьте человека, идущего по тропинке в лесу, и на каждом шагу ему приходится выбирать, какую развилку выбрать). Эти алгоритмы не гарантируют нахождение решения по каждому возможному пути вычислений, однако гарантируют нахождение правильного решения хотя бы по одному из путей (то есть, человек в лесу сможет найти свою хижину, только выбрав определенную комбинацию "правильных" развилок). Выбор можно рассматривать как предположение в процессе поиска. Многие задачи можно представить в виде недетерминированных алгоритмов, включая самый известный нерешенный вопрос в теории вычислений – вопрос о равенстве классов P и NP.

Реализация недетерминированных алгоритмов с детерминированными

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