Детерминированный алгоритм: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 1: Строка 1:
'''Детерминированный алгоритм''' — [[Алгоритм|алгоритмический]] процесс, который выдаёт уникальный и предопределённый результат для заданных входных данных.
'''Детерминированный алгоритм''' — [[Алгоритм|алгоритмический]] процесс, который выдаёт '''уникальный''' и '''предопределённый''' результат для заданных входных данных.


== Недетерминированный алгоритм ==
== Недетерминированный алгоритм ==
{{main|Недетерминированная машина Тьюринга}}
{{main|Недетерминированная машина Тьюринга}}
В [[информатика|информатике]], «'''недетерминированный алгоритм'''» — это [[алгоритм]], указывающий ''несколько'' путей обработки одних и тех же входных [[Данные|данных]], — ''без'' какого-либо уточнения, какой ''именно'' вариант будет ''выбран''.
В [[информатика|информатике]], «'''недетерминированный алгоритм'''» — это [[алгоритм]], указывающий ''несколько'' путей обработки одних и тех же входных [[Данные|данных]], — ''без'' какого-либо уточнения, какой '''''именно''''' вариант будет ''выбран''.


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


==== Теория алгоритмов ====
==== Теория алгоритмов ====
В [[теория алгоритмов|теории алгоритмов]] — под термином «'''алгоритм'''» обычно понимается «детерминированный» алгоритм. «Недетерминированный» — отличается от своего более известного «двойника» возможностью получения результата разными путями («детерминированный» — следует единственным путём: от [[Данные|данных]] — к результату, — тогда как некоторые пути выполнения «недетерминированного» могут привести к ''одинаковому'' результату, а некоторые — к ''другим'' результатам). Эти свойства описаны математически: в «недетерминированной» модели вычислений, известной как «[[недетерминированный автомат]]».
В [[теория алгоритмов|теории алгоритмов]] — под термином «'''алгоритм'''» обычно понимается «'''''детерминированный'''''» алгоритм. «'''Недетерминированный'''» — отличается от своего более известного «двойника» возможностью получения результата ''разными'' путями («'''детерминированный'''» — следует '''''единственным''''' путём: '''от [[Данные|данных]] — к результату''', — тогда как ''некоторые'' пути выполнения «'''недетерминированного'''» могут привести к ''одинаковому'' результату, а некоторые — к ''другим'' результатам). Эти '''свойства''' — описаны математически: в ''«недетерминированной» модели вычислений'', известной как '''«[[недетерминированный автомат]]»'''.


==== Разработка алгоритмов ====
==== Разработка алгоритмов ====
В разработке алгоритмов — «недетерминированные» алгоритмы часто используются, когда задача, решаемая алгоритмом, — по своей сути, — позволяет много выходов (или — когда существует ''один'' выход со ''многими'' путями, через которые он может быть найден, и ''все'' одинаково хороши). Важно, что ''каждый'' выход «недетерминированного» алгоритма — верный; — независимо от путей, выбранных алгоритмом во время выполнения.
В разработке алгоритмов — «'''недетерминированные'''» алгоритмы часто используются, когда '''''задача''''', решаемая алгоритмом, — по своей сути, — позволяет '''''много''''' выходов (или — когда существует ''один'' выход со ''многими'' путями, через которые он может быть ''найден'', и '''''все''''' «одинаково хороши»). Важно, что ''каждый'' выход «'''недетерминированного'''» алгоритма — '''верный'''; — независимо от путей, «''выбранных''» алгоритмом во время выполнения.


== Примеры ==
== Примеры ==
=== «Список покупок» ===
=== «Список покупок» ===
Представим «список покупок»: список товаров для покупки.
Представим «'''список покупок'''»: список товаров для покупки — что можно осмыслить двумя способами: как указание купить все эти товары...
* ...в '''''любом''''' порядке («'''недетерминированный'''» алгоритм);

* ...в '''''данном''''' порядке («'''детерминированный'''» алгоритм).
Это можно осмыслить двумя способами: как указание купить все эти товары...
* ... в ''любом'' порядке («недетерминированный» алгоритм);
* ... в ''данном'' порядке («детерминированный» алгоритм).


=== «Сортировка слиянием» ===
=== «Сортировка слиянием» ===
{{main|Сортировка слиянием}}
{{main|Сортировка слиянием}}
Допустим, — имеется набор сущностей (скажем, 300 студентов), который необходимо упорядочить (скажем, по «номерам» студентов). Один из алгоритмов для этого — «[[сортировка слиянием]]»:
Допустим, — имеется набор «''сущностей''» (скажем, 300 студентов), который необходимо «упорядочить» (скажем, по «номерам» студентов). Один из алгоритмов для этого — «[[сортировка слиянием]]»:
* Разделить набор на две приблизительно равные группы;
* Разделить набор на '''две''' ''приблизительно равные'' '''группы''';
* Отсортировать обе группы данной сортировкой (т.е. «[[рекурсия|рекурсивно]]»);
* Отсортировать '''обе''' '''группы''' данной сортировкой (т.е. «[[рекурсия|''рекурсивно'']]»);
* Объединить результаты («слить воедино»; см. название метода).
* '''Объединить''' результаты («''слить воедино''»; см. название метода).


Элементы могут быть ''уникально'' отсортированы, если критерий сортировки всегда определяет «полный» порядок (т.е. «номера» студентов ''уникальны'': не повторяются между собой). Но иначе (например, — если сортировать экзамены по фамилиям студентов ''без'' учёта однофамильцев) — результат сортировки ''не'' определён: неизвестно, какое именно упорядочение считать ''верным''; — т.е. алгоритм «недетерминированный».
'''Элементы''' могут быть «'''''уникально'''''» отсортированы, если критерий сортировки всегда определяет «''полный''» порядок (т.е. «номера» студентов «''уникальны''»: не ''повторяются'' между собой). Но иначе (например, — если сортировать экзамены по фамилиям студентов '''''без''''' учёта ''однофамильцев'') — результат сортировки ''не'' определён: неизвестно, какое ''именно'' упорядочение считать '''''верным'''''; — т.е. алгоритм «'''''недетерминированный'''''».


=== «Тест простоты» ===
=== «Тест простоты» ===
{{main|Перебор делителей}}
{{main|Перебор делителей}}
Задача: дано [[натуральное число]] больше единицы; определить, является ли это число [[простое число|простым]].
'''Задача''': дано [[натуральное число|''натуральное'' число]] больше единицы; определить, является ли оно [[простое число|простым]].


«Недетерминированный» алгоритм — следующий:
'''Решение''': «недетерминированный» алгоритм — следующий:
# Взять любое целое «''k»'' такое, что 2 ≤ ''k'' ≤ √(''n'');
# Взять любое целое «''k»'' такое, что 2 ≤ ''k'' ≤ √(''n'');
# Если «''k»'' является делителем «''n»'', остановиться с ответом «'''нет''»'''''; иначе — остановиться с ответом «'''неизвестно'''».
# Если «''k»'' является делителем «''n»'' остановиться с ответом «'''нет''»'''''; иначе — остановиться с ответом «'''''неизвестно'''''».
Видно, что алгоритм не всегда даёт «полезный» ответ, но никогда не даёт неправильного ответа.
Видно, что алгоритм ''не всегда'' даёт «'''''полезный'''''» ответ, но никогда не даёт '''неправильного''' ответа.


Этот алгоритм — «недетерминированный»: он не всегда выдаёт верное решение, но только при определённой комбинации выборов. Это пример ''поискового'' типа «недетерминированного» алгоритма.
Этот алгоритм — «'''недетерминированный'''»: он ''не всегда'' выдаёт «'''''полезное'''''» решение но может, при определённой комбинации выборов. Это пример «'''''поискового'''»'' типа «недетерминированного» алгоритма.


== См. также ==
== См. также ==

Версия от 05:17, 12 мая 2016

Детерминированный алгоритм — алгоритмический процесс, который выдаёт уникальный и предопределённый результат для заданных входных данных.

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

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

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

Теория алгоритмов

В теории алгоритмов — под термином «алгоритм» обычно понимается «детерминированный» алгоритм. «Недетерминированный» — отличается от своего более известного «двойника» возможностью получения результата разными путями («детерминированный» — следует единственным путём: от данных — к результату, — тогда как некоторые пути выполнения «недетерминированного» могут привести к одинаковому результату, а некоторые — к другим результатам). Эти свойства — описаны математически: в «недетерминированной» модели вычислений, известной как «недетерминированный автомат».

Разработка алгоритмов

В разработке алгоритмов — «недетерминированные» алгоритмы часто используются, когда задача, решаемая алгоритмом, — по своей сути, — позволяет много выходов (или — когда существует один выход со многими путями, через которые он может быть найден, и все «одинаково хороши»). Важно, что каждый выход «недетерминированного» алгоритма — верный; — независимо от путей, «выбранных» алгоритмом во время выполнения.

Примеры

«Список покупок»

Представим «список покупок»: список товаров для покупки — что можно осмыслить двумя способами: как указание купить все эти товары...

  • ...в любом порядке («недетерминированный» алгоритм);
  • ...в данном порядке («детерминированный» алгоритм).

«Сортировка слиянием»

Допустим, — имеется набор «сущностей» (скажем, — 300 студентов), который необходимо «упорядочить» (скажем, — по «номерам» студентов). Один из алгоритмов для этого — «сортировка слиянием»:

  • Разделить набор на две приблизительно равные группы;
  • Отсортировать обе группы данной сортировкой (т.е. «рекурсивно»);
  • Объединить результаты («слить воедино»; см. название метода).

Элементы могут быть «уникально» отсортированы, если критерий сортировки всегда определяет «полный» порядок (т.е. «номера» студентов «уникальны»: не повторяются между собой). Но иначе (например, — если сортировать экзамены по фамилиям студентов без учёта однофамильцев) — результат сортировки не определён: неизвестно, какое именно упорядочение считать верным; — т.е. алгоритм «недетерминированный».

«Тест простоты»

Задача: дано натуральное число больше единицы; определить, является ли оно простым.

Решение: «недетерминированный» алгоритм — следующий:

  1. Взять любое целое « — такое, что 2 ≤ k ≤ √(n);
  2. Если « является делителем « — остановиться с ответом «нет»; иначе — остановиться с ответом «неизвестно».

Видно, что алгоритм не всегда даёт «полезный» ответ, но никогда не даёт неправильного ответа.

Этот алгоритм — «недетерминированный»: он не всегда выдаёт «полезное» решение — но может, при определённой комбинации выборов. Это — пример «поискового» типа «недетерминированного» алгоритма.

См. также