Трудність знайти слово довжини не більше


10

Постановка проблеми :

Дозволяє M бути (потенційно недетермінованим) автоматичним натисканням та пускати Aбути його вхідним алфавітом. Чи є словоwA вул |w|k що прийнято М ?

Чи не завершена ця проблема NP? Це було вивчено? Чи існує алгоритм, що дозволяє знайти таке слово?


Чи не повинен алгоритм Джикстри робити хитрість? (Я, мабуть, щось тут не
розумію

"довжина не більше k"?
alpoge

Вас вітає, Каве. Так, я забув "щонайбільше", редагував ще раз.
Ламінь

1
Відповідь проста - це питання домашнього завдання?
Саріель Хар-Пелед

Чи маємо ми доступ до опису автоматів чи ми маємо його лише як чорний ящик?
Рафаель

Відповіді:


9

Обчисліть перетин вашої мови CFG із звичайною мовою i=0kAk (це означає множення кількості штатів на kі додавання стану "тупикової точки"). Тепер перевірте, чи результат порожній: перетворіть у граматику (я думаю, що результат матиме поліноміальний розмір) та "зволікайте" з виробництва epsilon.

Редагувати: Каве згадував, що це багаточлен k, так що якщо k задається як вхід, алгоритм експоненціальний в |k|. Однак Каве знайшов спосіб це виправити. Перетворіть оригінальний автомат у CFG та замініть всі клеми фіксованим терміналом. Тепер використовуйте ітеративний алгоритм, щоб знайти мінімальний розмір слова, згенерованого кожним нетермінальним, наступним чином.

Ініціалізуйте всі довжини за допомогою , а потім ітераційним чином оновлювати всі довжини очевидним способом: задано виробництво AatBi (порядок не має значення), постав f(A)=min(f(A),t+f(Bi)). Претензія: це сходить вO(n) ітерації, де n- кількість нетерміналів. Причина полягає в тому, що в дереві, що генерує слово мінімальної довжини, жоден нетермінал не використовується двічі; кожен "край" бере щонайменше одну ітерацію для обробки (деякі краї можна "оновлювати" паралельно).


Я також думаю, що трансформація КПК CFG є многочленом. Дякую! Тож проблема вP.
Ламін

Гаразд, оскільки є спосіб обчислити безпосередньо найменшу довжину, |k|не є входом. Але я не розумію, чому замінювати всі термінали на фіксований. Алгоритм повинен правильно працювати з оригінальними терміналами.
Ламінь

Ви маєте рацію, насправді це не має значення.
Yuval Filmus

5

Змініть усі символи алфавіту на один конкретний символ. Тепер у вас визначено КПК для одного символу. Його мова - граматика без контексту. Однак контекстна граматика над одним символом є регулярною. Отже, перетворіть CFG в звичайну мову і перевірте, чи містить він слово довжиною k.

Тепер усі ці перетворення, як правило, вимагають експоненціального часу, але мені здається малоймовірним, що проблема не завершена. Особливо, якщо ви допускаєте час полінома вk.

Я можу помилятися, і прошу вибачення за свою первинну прискіпливу відповідь ...

До речі, те, що CFG над однією буквою є регулярною, випливає з теореми Паріха. Хоча прямий доказ не надто важкий. Детальніше про теорему Париха див. За посиланням - це прекрасний результат ... http://www8.cs.umu.se/kurser/TDBC92/VT06/final/3.pdf


Ні, я не студент. Проблему, про яку я згадував, спочатку є мережевою проблемою, яку моделювали як автоматичну. Я би просто знав, варто шукати поліноміальне рішення чи ні.
Ламінь

5
Чи не повинна ця відповідь бути коментарем?
Олександр Бондаренко

2
Так, слід. Саріель, ти міг би перенести це до коментаря чи дати відповідь?
Суреш Венкат


Я перемістив оригінальну відповідь на коментар. Це нова відповідь.
Суреш Венкат

0

Напевно, неоптимальний метод: Запустіть алгоритм Джикстра. Потім для кожного кінцевого стану порівняйте відстаніk. Якщо такі єk, прийняти. Відхилити.

РЕДАКТУВАННЯ: Наведене вище працює лише для НФА! Вибач за те.


(але, безумовно, полі-час!)
alpoge

Я не впевнений, що алгоритм Дейкстри може вирішити проблему. Тут можна знайти найкоротший шлях між початковим станом та кінцевим. Звичайно, може бути сформовано слово, яке можна прийняти за допомогою цих шляхів. Але ці шляхи є елементарними, і слова можна прийняти невідповідними шляхами; в іншому випадку проблема визначення того, чи може без контексту граматика генерувати будь-яке слово, вирішується, але це не так.
Ламінь

Тестування порожнечі на CFL є вирішальним, ні?
alpoge

(Пробач мені ще раз, якщо я нерозумію!)
alpoge

Ну, можна скористатися алгоритмом "маркування", щоб зробити це (зважаючи на CFG) - маркування терміналів, потім маркування речей, які отримують термінали, потім маркування речей, що походять із позначених речей тощо, доки процес не закінчиться, а потім перевірка якщо позначена змінна старт. Крім того, ігноруйте мою відповідь - це те, що ви повинні зробити для NFA (звичайно, не для КПК!).
alpoge
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.