在字符串上执行正则表达式比较所需的复杂度如何随着字符串长度变化而变化?
在字符串上执行正则表达式比较所需的复杂度如何随着字符串长度变化而变化?
O(N)
时间内匹配长度为N
的字符串。某些正则表达式语言的扩展会使情况变得更糟。您可能会对以下文件感兴趣:正则表达式匹配可以简单快速。*
) 来实现。像 +
这样的运算符只是语法糖,不会增加正则表达式的表达能力。捕获表达式不是经典正则表达式的一部分,因为它们允许您匹配非正则语言(一个经典的例子是 (.*)x(\1)
,它甚至不能描述上下文无关语言)。 - chepnerunbounded - 您可以创建一个在空输入字符串上永远不会终止的正则表达式。
如果您使用普通的正则表达式(TCS:不带反向引用,连接,交替,Kleene星号),并且正则表达式已经编译,则时间复杂度为O(n)。
如果你正在寻找关于RegEx的紧密渐近界限(不考虑表达式本身),那么是没有的。正如Alex所指出的,您可以创建一个O(1)的正则表达式或一个Omega(无穷大)的正则表达式。作为纯数学算法,正则表达式引擎将过于复杂,无法执行任何形式的渐近分析(除了这种分析基本上毫无价值的事实之外)。
特定表达式的增长率(因为它实际上构成了一种算法)会更有意义,尽管不一定更容易分析。