stringtranslate.com

Детерминированный алгоритм

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

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

Формальное определение

Детерминированные алгоритмы можно определить в терминах конечного автомата : состояние описывает, что делает автомат в определенный момент времени. Конечные автоматы дискретно переходят из одного состояния в другое. Сразу после ввода входных данных автомат находится в своем начальном состоянии или начальном состоянии . Если автомат детерминирован, это означает, что с этого момента его текущее состояние определяет, каким будет его следующее состояние; его путь через набор состояний предопределен. Обратите внимание, что автомат может быть детерминированным и при этом никогда не останавливаться и не заканчивать работу, и, следовательно, не выдавать результат.

Примерами конкретных абстрактных машин , которые являются детерминированными, являются детерминированная машина Тьюринга и детерминированный конечный автомат .

Недетерминированные алгоритмы

Различные факторы могут привести к тому, что алгоритм будет вести себя недетерминированным или недетерминированным образом:

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

Распространенность многоядерных процессоров привела к всплеску интереса к детерминизму в параллельном программировании, а проблемы недетерминизма были хорошо документированы. [1] [2] Было предложено несколько инструментов, помогающих справиться с проблемами [3] [4] [5] [6] для борьбы с взаимоблокировками и состояниями гонки .

Недостатки детерминизма

В некоторых случаях для программы выгодно демонстрировать недетерминированное поведение. Например, поведение программы тасования карт, используемой в игре в блэкджек , не должно быть предсказуемым игроками — даже если исходный код программы виден. Использование генератора псевдослучайных чисел часто недостаточно для того, чтобы гарантировать, что игроки не смогут предсказать результат тасования. Умный игрок может точно угадать числа, которые выберет генератор, и таким образом определить все содержимое колоды заранее, что позволит ему обмануть; например, группа безопасности программного обеспечения в Reliable Software Technologies смогла сделать это для реализации Texas Hold 'em Poker, распространяемой ASF Software, Inc, что позволило им последовательно предсказывать результат рук заранее. [7] Этих проблем можно избежать, отчасти, за счет использования криптографически безопасного генератора псевдослучайных чисел , но все равно необходимо использовать непредсказуемое случайное начальное число для инициализации генератора. Для этой цели необходим источник недетерминизма, например, такой, который обеспечивается аппаратным генератором случайных чисел .

Обратите внимание, что отрицательный ответ на проблему P=NP не будет означать, что программы с недетерминированным выводом теоретически более мощные, чем программы с детерминированным выводом. Класс сложности NP (complexity) может быть определен без какой-либо ссылки на недетерминизм с использованием определения на основе верификатора .

Категории детерминизма в языках

Меркурий

Логико-функциональный язык программирования Mercury устанавливает различные категории детерминизма для предикатных режимов , как поясняется в ссылке. [8] [9]

Хаскелл

Haskell предоставляет несколько механизмов:

Семейство ML и производные языки

Как видно из Standard ML , OCaml и Scala

Ява

В Java значение ссылки null может представлять собой неудачный (внедомен) результат.

Смотрите также

Ссылки

  1. ^ Эдвард А. Ли. «Проблема с потоками» (PDF) . Получено 29.05.2009 .
  2. ^ Боччино-младший, Роберт Л.; Адве, Викрам С.; Адве, Сарита В.; Снир, Марк (2009). Параллельное программирование должно быть детерминированным по умолчанию. Семинар USENIX по актуальным темам параллелизма.
  3. ^ "Intel Parallel Inspector Thread Checker" . Получено 29.05.2009 .
  4. ^ Юань Линь. «Обнаружение гонки данных и взаимоблокировок с помощью анализатора потоков Sun Studio» (PDF) . Получено 29.05.2009 .
  5. ^ Intel. "Intel Parallel Inspector" . Получено 29.05.2009 .
  6. ^ Дэвид Уортингтон. "Intel решает жизненный цикл разработки с помощью Parallel Studio". Архивировано из оригинала 2009-05-28 . Получено 2009-05-26 .
  7. ^ Макгроу, Гэри ; Виега, Джон . «Заставьте свое программное обеспечение вести себя: Игра с числами: Как мошенничать в азартных играх онлайн». IBM . Архивировано из оригинала 2008-03-13 . Получено 2007-07-02 .
  8. ^ "Категории детерминизма в языке программирования Mercury". Архивировано из оригинала 2012-07-03 . Получено 2013-02-23 .
  9. ^ "Mercury predicate modes". Архивировано из оригинала 2012-07-03 . Получено 2013-02-25 .
  10. ^ «Представление неудачи с использованием монады Maybe».
  11. ^ "Класс MonadPlus".