Так, ви правильні комп'ютери, детерміновані автоматизовані. Недетерміновані моделі є більш корисними з теоретичної мети, колись детермінований рішення не є настільки очевидним для визначення (або, наприклад, постановки проблеми) і настільки мало важко знайти рішення. Тоді один підхід полягає в тому, що спочатку розробити недетерміновану модель, яку може бути порівняно просто спроектувати, а потім спробувати перетворити її в детерміновану. Нижче я спробував продемонструвати, що я маю на увазі на прикладі. Розглянемо регулярний вираз:
(01)*01(0 + 1)*
Тепер припустимо, якщо вас попросять намалювати DFA для мови, створеної вище RE.
З моїм знанням проектування асоціацій, я знаю , що (1) , коли *
присутній в регулярному виразі показала мені потрібно відповідне цикл в FA (2) З'єднати операції як a.b
засіб що - щось на кшталт: .(q0)─a→(q1)─b→(q2)
Отже, при моїй кулачній спробі я намалював би NFA на зразок:
Думав, що це не детерміноване рішення, але виглядає дуже простою ФА, яку можна легко сконструювати, використовуючи заданий регулярний вираз. Мій вид аналогії, щоб показати схожість між вищенаведеним регулярним виразом і моїм NFA, наведено нижче:
- Цикл у стані q 0 повинен бути для
(01)*
01
(після (01)*
) дає(q0)─0→(q1)─1→(q2)
(0 + 1)*
дає цикл самоврядування в стані q 2 для мітки 0, 1
Згідно з моєю аналогією, я вважаю, що ФА, який я накреслив вище, порівняно просто отримати з даного РЕ. На щастя, у класі кінцевих автоматів кожна недетермінована модель може бути перетворена на еквівалентну детерміновану модель. У нас є алгоритмічний метод перетворення NFA в DFA . Тож я можу легко перетворити вище NFA у DFA:
Інша частина, на жаль, це не завжди можливо перетворити недетерміновану модель в детерміновану, наприклад, клас для детермінованого автоматичного натискання - це підмножина класу детермінованих автоматизованих висувних автоматичних «перевіряє діаграму Венна », і ви не завжди можете конвертувати NPDA в КПК.
Зазвичай, коли неможливо перетворити недетермінований розчин у детермінований, то за допомогою недетермінованого рішення ми визначаємо детерміновані рішення в піддомен (або, скажімо, частковий домен) замість повного домену. Або ми визначаємо рішення якимись іншими способами (наприклад, жадібним підходом), що, звичайно, не може дати вам оптимальне рішення .
Іноді недетермінізм є ефективним механізмом для точного та ефективного опису якоїсь складної проблеми / рішення, наприклад, недетерміновані машини можуть слугувати моделлю алгоритму пошуку і зворотного відстеження (читайте: Як рядковий процес в недетермінованій моделі з використанням backtrack ). Навпаки детерміновані моделі краще представляють ефективні, мінімізовані та менш зайві рішення.
Тут я також хочу процитувати з Вікіпедії Використання недетермінованого алгоритму :
У дизайні алгоритмів часто не використовуються недетерміновані алгоритми, коли проблема, розв’язана алгоритмом, по суті дозволяє отримати декілька результатів (або коли є один результат з кількома шляхами, за допомогою яких може бути виявлений результат, кожен однаково кращий). Важливо, що кожен результат, який виробляє недетермінований алгоритм, є дійсним, незалежно від того, який вибір алгоритм робить під час роботи.
Велика кількість проблем може бути концептуалізована за допомогою недетермінованих алгоритмів, включаючи найвідоміше невирішене питання в теорії обчислень, P vs NP.
Як також згадував @keshlam у своєму коментарі : "Недетермінізм" на практиці використовується для позначення будь-якої непередбачуваності в результаті якогось процесу. Наприклад, одночасні програми демонструють недетерміновану поведінку - два виконання однієї програми з одним і тим же входом можуть давати різні результати (якщо не застосовується механізм контролю сумісності). Детальніше про це читайте у "Корисність недетермінізму" .
Я б також запропонував вам прочитати наступні посилання:
1. Яка різниця між недетермінізмом та випадковістю?
2. 9.2.2 Недетерміновані проти ймовірнісні моделі: (a). Недетермінований: Я поняття не маю, що робитиме природа. (б). Імовірнісний: Я спостерігав за природою та збирав статистику.
3. Недетерміноване програмування