Чи можна сказати, що DFA є більш ефективним, ніж NFA?


13

Я щойно почав читати про теорію обчислення. Якщо порівняти, який є більш потужним (у прийнятті рядків), обидва однакові. А як щодо ефективності? DFA буде швидким порівняно з NFA, оскільки він має лише один вихідний край, і не буде двозначності. Але у випадку з NFA ми повинні перевірити всі можливі випадки, і це, безумовно, потребує часу. Тож чи можна сказати, що DFA є більш ефективним, ніж NFA?

Але моя інша частина мозку також думає, що NFA існує лише теоретично, тому ми не можемо порівняти її ефективність з DFA.

Відповіді:


16

Є два відповіді, залежно від того, як ви визначаєте ефективність.

Компактність представлення

Якщо говорити більше, то менше : НФО ефективніші.

Перетворення DFA в NFA є простим і не збільшує розмір представлення.

Однак є звичайні мови, для яких найменший показник DFA є експоненціально більшим, ніж найменший NFA. Типовим прикладом є для нерухомих. k(a|b)b(a|b)kk

Обчислення

Запуск швидко : DFA ефективніші.

Комп'ютери, якими ми сьогодні користуємось, мають детермінований характер. Це робить їх поганим у поводженні з недетермінізмом. Є два загальних способи детермінованого поводження з NFA: зворотний трек на одній стороні, який є досить дорогим, або відстеження активних станів, що означає, що кожен перехід займе до разів довше (де - розмір NFA) .NNN


Що стосується компактності, то NFA не завжди ефективніші! Це правда, що існують мови, для яких мінімальний коефіцієнт DFA є експоненціально більшим, ніж найбільш компактний NFA, але яка частка таких мов у наборі всіх мов?
saadtaame

2
@saadtaame Це може здатися дивним, але в найсуворішому сенсі, NFA не повинні бути недетермінованими. DFA - це особливий вид NFA, тобто NFA з одинарним стартовим набором, а функція переходу така, що в один момент часу активний лише один стан.
Хаур

2
-1 "збільшення її розміру (потенційно багато)". Моделювання наборів станів NFA шляхом збереження місця зв'язаного списку витрат максимум у кількості станів NFA. З іншого боку, еквівалентна DFA може мати стан . O ( 2 N )O(N)O(2N)
Мандрівна логіка

@WanderingLogic Ви маєте рацію, конверсія не повинна бути явною (ви все ще використовуєте еквівалентну DFA, тільки не в розширеній формі). Однак основна суть все ще стоїть, оскільки для цього потрібно разів більше часу на обчислення, ніж використання DFA того ж розміру . Я виправлю останній абзац, щоб врахувати це. O(N)
Хаур

Дякую за цю відповідь, тому що я в своєму дослідженні стверджував, що НФА краще оцінювати, і зараз я бачу, що справа є більш тонкою. Загалом, NFA, безумовно, краще для фіксованої мови, тому що будь-який розумний алгоритм оцінки NFA буде відповідати складності оцінювання DFA в особливому випадку, коли NFA є DFA, і тому що NFA може бути більш лаконічним. Однак якщо вибір полягає в тому, щоб створити NFA з високою недетермінованою діяльністю або знайти розумний спосіб отримати DFA того ж розміру замість цього, для якоїсь конкретної програми, DFA краще.
6005

4

За потужністю вони еквівалентні, як ви сказали, і існує алгоритм (побудова підмножини) для перетворення NFA в еквівалентний DFA. Як ви можете сказати з назви алгоритму, він будує підмножини станів NFA. Якщо ваша NFA має станів, алгоритм може вивести DFA з станами, але це верхня межа. Іноді кількість станів взагалі не змінюється або навіть зменшується. Тож на практиці важливо менше, яким саме користуватися.2 nn2n

Відповідність DFA лінійна за розміром вхідного рядка. Відповідність NFA передбачає зворотний відстеження, тому НФА роблять більше роботи. Таким чином, DFA є більш ефективними.


Але чи можна сказати, що DFA є більш ефективним?
avi

1
@avi Я редагував питання! І, до речі, NFA не існують лише в теорії: перевірити це: swtch.com/~rsc/regexp/regexp1.html
saadtaame

@avi Проблема тут полягає в тому, що коефіцієнт DFA, еквівалентний NFA, буде (часто) значно більшим. Тож хоч ви можете перевірити DFA набагато швидше, зазвичай вам доведеться перевірити великий DFA.
Пітер

@ Peeter, що DFA є більшим не має значення: це просто означає, що масив, що дає функцію переходу, більший.
vonbrand

1
@Khaur, правда. Але якщо ви потрапили в цей вид проблеми, у вас є Humongous DFA.
vonbrand

2

Просто додавши відповіді вище:

NFA можуть бути обчислювально ефективнішими, ніж DFA, в тому сенсі, що вони можуть бути імітовані на паралельному процесорі.

До речі: я бачу людей, які говорять про те, що НФА не можуть існувати насправді. Дозволю собі не погодитися. Комп'ютер з великою кількістю процесорів може виконувати багато завдань паралельно і може розглядатися як недетермінований апарат. Можна було призначити кожну гілку обчислень новому процесору і зупинити їх усі, коли хтось із них приймає.


1
Ні DFA, ні NFA не існують в реальності, обидва є лише математичними відносинами, і обидва можуть бути імітовані алгоритмами.
jmite

1

Якщо ви використовуєте суто теоретичний захід "кількість кроків для прийняття / відхилення", DFA завжди буде дешевшим, ніж NFA, який використовує -переходи. Для більш складних автоматів такий захід матиме значення.ϵ


ϵ

1
ϵ

але чи DFA не вільний від ϵ-переходів?
аві

@avi, так. Не соромтесь відредагувати відповідь, якщо вона там незрозуміла.
фонбранд

ні, я прошу вас. Я також не впевнений у цьому
аві

1

Як зазначали інші, ви повинні визначити, що означає "ефективність". Щоб проілюструвати це, я даю розумну модель з іншою відповіддю.

Дивлячись тільки на моделі автоматів, які ігнорують, зокрема, як ви реалізували б їх на реальних машинах, очевидним показником ефективності є "кількість переходів, здійснених на (найкоротший) приймаючий пробіг".

ε


1

Технічно кажучи, NFA є більш загальним поняттям, ніж DFA, оскільки не вимагає використання недетермінізму. Іншими словами: кожен DFA - це NFA. З цієї точки зору, для кожної мови існує NFA, який є принаймні настільки ж ефективним, як і найефективніший DFA, незалежно від того, яким ви б прихилили.

Крім цього, я погоджуюся з Рафаелем, що це дуже залежить від того, що ви маєте на увазі під ефективністю та реалізацією.


-4

Як ми знаємо про Автомати, тобто машини, які можуть виконувати будь-які дії без будь-якої сили людини або без безпосередньої участі людини. наприклад: пральна машина. Кінцеві Автомати означають, що ми знаємо обсяг виконання завдання машиною, як 1 натискання ON, 2 натискання OFF, тож є лише 2 стани, тобто називаються кінцевими автомати. Тепер перейдіть до DFA, тобто детермінованих автоматичних програм Finite. формально маємо на увазі, що ми можемо легко визначити стани, що немає двозначності, і неофіційно йому потрібен лише 1 перехід, дозволений на 1 символі. NFA: недетерміновані кінцеві автомати. для обчислення фактичного стану потрібно більше часу, і існує неоднозначність, і неофіційно говориться, що на 1 символі є кілька дозволених переходів. у випадку, коли час дістатися до пункту призначення NFA займає більше часу, ніж DFA, але NFA може завантажувати більше даних, ніж DFA. * DFA та NFA мають однакову силу для розпізнавання рядка. дякую .. Діпалі каушик


1
Кінцеві автомати не мають нічого спільного з пральними машинами.
Девід Річербі

2
@DavidRicherby. Можливо, фраза «нічого нічого» трохи не сильна. Зрештою, можна сказати, що пральна машина має стан, готовий , мити , промивати та прясти з відповідними переходами між станами. Кращою метафорою був би монетний автомат з газованою содою.
Рік Декер

1
@RickDecker Погодився, але витрачати час на обговорення крихітної актуальності може бути прикладом того, що Вікіпедія називає « надмірною вагою ». І, у будь-якому випадку, частина відповіді, про яку я говорю, - це обговорення автоматів як автономних машин, а не обчислювальних пристроїв.
Девід Річербі

1
Я не думаю, що ця відповідь не додає нічого важливого до питання. Зокрема, вам незрозуміло щодо вашої міри ефективності і, здається, поєднуєте декілька проблем.
Рафаель

Інші відповіді майже вичерпують усе сказане, і, на жаль, ваша відповідь трохи заплутана.
Зло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.