Обчисліть перетин вашої мови CFG із звичайною мовою ∑ki=0Ak (це означає множення кількості штатів на kі додавання стану "тупикової точки"). Тепер перевірте, чи результат порожній: перетворіть у граматику (я думаю, що результат матиме поліноміальний розмір) та "зволікайте" з виробництва epsilon.
Редагувати: Каве згадував, що це багаточлен k, так що якщо k задається як вхід, алгоритм експоненціальний в |k|. Однак Каве знайшов спосіб це виправити. Перетворіть оригінальний автомат у CFG та замініть всі клеми фіксованим терміналом. Тепер використовуйте ітеративний алгоритм, щоб знайти мінімальний розмір слова, згенерованого кожним нетермінальним, наступним чином.
Ініціалізуйте всі довжини за допомогою ∞, а потім ітераційним чином оновлювати всі довжини очевидним способом: задано виробництво A→at∏Bi (порядок не має значення), постав f(A)=min(f(A),t+∑f(Bi)). Претензія: це сходить вO(n) ітерації, де n- кількість нетерміналів. Причина полягає в тому, що в дереві, що генерує слово мінімальної довжини, жоден нетермінал не використовується двічі; кожен "край" бере щонайменше одну ітерацію для обробки (деякі краї можна "оновлювати" паралельно).