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


10

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

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

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


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

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

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

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

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

Відповіді:


9

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

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

Ініціалізуйте всі довжини за допомогою ∞, а потім ітераційним чином оновлювати всі довжини очевидним способом: задано виробництво A→at∏Bi (порядок не має значення), постав 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.