У чому складність регулярних виразів?


75

Яка складність щодо довжини рядка, необхідна для виконання порівняння регулярних виразів для рядка?


3
Складність залежить більше від природи самого регулярного виразу, ніж від довжини рядка.
LukeH

@LukeH Як варіант, це залежить від використовуваної мови програмування. Наприклад, Python Regex ніколи не може перевищити потужність комп'ютера DFA, але Perl Regex може бути повною для Тьюрінга.
BlackVegetable

Відповіді:


71

Відповідь залежить від того, що саме ви маєте на увазі під "регулярними виразами". Класичні регулярні вирази можуть бути скомпільовані у детерміновані кінцеві автомати, які можуть відповідати рядку довжини Nв O(N)часі. Деякі розширення мови регулярних виразів змінюють це на гірше.

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


Я не думаю, що можна було б отримати тестові дані, використані для цієї статті? На моєму робочому місці постійно використовуються регулярні вирази perl. Якби вони були справді такими повільними, наше обладнання повністю вийшло б з ладу.
DeepDeadpool

9

необмежений - ви можете створити регулярний вираз, який ніколи не закінчується, на порожньому вхідному рядку.


2
Просто з цікавості, не могли б ви навести приклад Алекс?

5
див. man perlre - "'foo' = ~ m {(o?) *} x;". У Perl є спеціальний код для виявлення нескінченної рекурсії в цьому випадку та спалаху.
Alex Brown

7

Якщо ви використовуєте звичайний (TCS: відсутність зворотного посилання, конкатенації, чергування, зірка Кліне), регулярне вираження та регулярне вираження вже скомпільовано, тоді це O (n).


0

Якщо ви шукаєте жорсткі асимптотичні межі на RegEx (без урахування самого виразу), тоді їх немає. Як зазначає Алекс, ви можете створити регулярний вираз, який є O (1), або регулярний вираз, який є Omega (нескінченність). Як чисто математичний алгоритм, механізм регулярних виразів буде надто складним для виконання будь-якого формального асимптотичного аналізу (крім того, що такий аналіз в основному був би ні до чого).

Швидкість зростання певного виразу (оскільки це, насправді, є алгоритмом, у будь-якому випадку) буде набагато більш значущою, хоча і не обов'язково простішою для аналізу.


1
Це враховує розширення формальних регулярних виразів. Регулярні вирази, що включають звичайні конструкції (наприклад, відсутність шаблонів перегляду вперед / назад), завжди можуть закінчуватися на будь-якому вході, за час O (довжина вхідного рядка).
Клеман

@clement Навіть більшість розширень не висувають RE за межі DFA. Наприклад, Python Regex завжди може змоделювати DFA. Однак, як тільки ви починаєте працювати з регулярним виразом Perl (а я вважаю Javascript?), Він стає іншою твариною, яка замість цього еквівалентна ТМ.
BlackVegetable

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