Чи є регекс-гольф NP-Complete?


27

Як видно з цієї недавньої смужки XKCD і цієї останньої публікації в блозівід Пітера Норвіга (і повість Slashdot із останньою), "гольф" регулярного вираження "(який можна краще назвати проблемою розділення регулярних виразів) - це загадка визначення найкоротшого можливого регулярного виразу, який приймає кожне слово у множині A і жодне слово в Набір Б. Норвіга містить алгоритм для генерування досить короткого кандидата, і він зазначає, що його підхід включає вирішення проблеми NP Повне покриття, але він також обережно зазначив, що його підхід не враховує всіх можливих регулярних виразів, і, звичайно, його не обов'язково єдиний алгоритм, тому його рішення не гарантовано є оптимальними, і також можливо, що якийсь інший алгоритм, який має багатозначний час, може знайти рівноцінні або кращі рішення.

З метою конкретності та уникнення необхідності вирішувати питання оптимізації, я думаю, що найбільш природним формулюванням розділення регулярних виразів було б:

Враховуючи два (кінцеві) множини і B рядків над деяким алфавітом Σ , чи існує регулярний вираз довжиною k, який приймає кожну рядок у A і відхиляє кожну рядок у B ?ABΣkAB

Чи відомо щось про складність цієї конкретної проблеми розділення? (Зауважте, що оскільки я вказав і B як кінцеві набори рядків, то природним поняттям розміру для задачі є загальна довжина всіх рядків у A і B ; це болотає будь-який внесок від k ). Мені здається дуже ймовірним, що воно є повним NP (і насправді, я б очікував, що скорочення стосується якоїсь проблеми покриття), але кілька пошуків не виявили нічого корисного.ABABk


4
Це навіть в НП? Даючи регулярний вираз, як ви перевіряєте, чи є слово в описуваній мові в поліноміальний час? Стандартний підхід - перетворення на NFA, потім DFA і перевірка - займає експоненціальний час у (?). k
Рафаель

1
має бути повним PSPACE; дивіться (Gramlich, Schnitger, Мінімізація NFA та регулярних виразів, 2005) на ggramlich.github.io/Publications/approximationSTACS05Pres.pdf та citeseerx.ist.psu.edu/viewdoc/… (PS: Я публікую це як коментар, тому що відповідь має пояснити, чому, але наразі у мене немає часу; можливо, хтось може скористатись посиланням та пояснити, як це працює)
rgrig

1
Для регулярних виразів, як їх розуміють у TCS, проблема полягає в NP (Сертифікат розміру полінома та перевіряється в поліноміальний час був би самим регулярним виразом). Він (напевно) не в NP, якщо ми використовуємо, наприклад, PCRE для регулярних виразів, оскільки навіть тестування членства є важким NP ( perl.plover.com/NPC/NPC-3SAT.html ).
Майк Б.

1
@MikeB. А як саме ти перевіряєш поліноміальний час? Ви бачили коментар @Raphael?
rgrig

5
(1) Ви можете запустити детермінований алгоритм в P, щоб перевірити приналежність до NFA (почніть в стартовому стані, і запам’ятайте всі стани, в яких ви можете знаходитись після вживання символу слова. Досягніть кінця, перевірте, чи досягли ви хоча б остаточний стан.) (2) Це залежить від визначення поняття "регулярний вираз" - чи ми використовуємо той, що є вченим-комп’ютером, або програмістом? Чи дозволені ми лише звичайні мови або (підмножина) контекстно-чутливих мов (отже, PCRE)?
Майк Б.

Відповіді:


15

Якщо припустити TCS-варіант регулярного виразів, проблема справді є NP-повною.

Ми припускаємо, що наші реджекси містять

  • листи від , що відповідають собі,Σ
  • , що позначає союз,+
  • , що позначає конкатенацію,
  • , що позначає Клін-Зірку,
  • , що відповідає порожньому рядкуλ

і більше нічого. Довжина регулярного вираження визначається як кількість символів від . Як і в коміксах, ми вважаємо, що регулярний вираз збігається зі словом, якщо він відповідає підрядку слова. (Зміна будь-якого з цих припущень повинна впливати лише на складність конструкції нижче, але не на загальний результат.)Σ

Що це в NP, це просто, як пояснено в коментарях (перевірити кандидата-RE, переклавши його в NFA і виконуючи це на всіх словах з і B ).AB

Для того, щоб показати твердість NP, ми зменшуємо встановити кришку:

Враховуючи всесвіт та колекцію C підмножин U , чи існує набір C C розміром k, щоб S C S = U ?UCUCCkSCS=U

Ми перекладаємо вхід для Set cover в один для регекс-гольфу наступним чином:

  • містить один символ для кожного підмножини в C та один додатковий символ (позначається x у наступному).ΣCx
  • Містить одне слово для кожного елемента е з U . Слово складається саме з символів, що представляють підмножини на C, які містять e (у довільному порядку).AeUCe
  • містить одне слово x .Bx
  • просто переноситься.k

Це зменшення, очевидно, в P, а еквівалентність також досить просто побачити:

  • c1,,ckc1++ck
  • xAkΣAC

1
ABO(n)a1+a2+...,aiAO(n)k

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