Какова сложность регулярного выражения? - PullRequest
65 голосов
/ 07 декабря 2010

Какова сложность по отношению к длине строки, которая требуется для сравнения строки с регулярным выражением?

Ответы [ 4 ]

56 голосов
/ 07 декабря 2010

Ответ зависит от того, что именно вы подразумеваете под «регулярными выражениями».Классические регулярные выражения могут быть скомпилированы в Детерминированные конечные автоматы , которые могут соответствовать строке длины N за O(N) времени.Некоторые расширения языка регулярных выражений меняют это к худшему.

Вы можете найти следующий интересующий документ: Соответствие регулярному выражению может быть простым и быстрым .

9 голосов
/ 07 декабря 2010

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

6 голосов
/ 07 декабря 2010

Если вы используете обычный (TCS: без обратной ссылки, конкатенации, чередования, звезды Клини) регулярное выражение и регулярное выражение уже скомпилировано, то это O (n).

0 голосов
/ 07 декабря 2010

Если вы ищете точные асимптотические границы для RegEx (без учета самого выражения), то их нет. Как указывает Алекс, вы можете создать регулярное выражение O (1) или регулярное выражение Omega (бесконечность). Будучи чисто математическим алгоритмом, механизм регулярных выражений был бы слишком сложным для выполнения какого-либо формального асимптотического анализа (за исключением того факта, что такой анализ в основном бесполезен).

Скорость роста определенного выражения (поскольку это, в любом случае, представляет собой алгоритм) была бы гораздо более значимой, хотя не обязательно легче анализировать.

...