问题Complexity of Regex substitution接近问题,但不一样。根据企业的回复,(DFA引擎的)复杂性是:
O(2 ^ m + n)[其中m是正则表达式的长度,n是字符串的长度]
第15-16页的红皮书“算法设计手册”讨论了不同算法的时间。据此,当算法的长度超过1,000,000时,O(m ^ 2)的算法是没有希望的。假设操作时间为1纳秒,处理需要16.7分钟。
书中的陈述增强了我的兴趣。你可以在16.7分钟的处理时间内完成1,000,000个字符长的正则表达式吗?你能做一个灾难性的正则表达式并且处理时间仍然存在吗?我真的很怀疑。
在多项式时间内,操作时间为1纳秒的最长正则表达式是什么?
答案 0 :(得分:2)
这是一个毫无意义的问题。正则表达式不是算法,它们是一种语言。这种语言的许多实现都有自己的性能特征,每个单独的正则表达式都有自己的成本。例如,交替/(a|b|c)/
是一个可并行化的问题,因此在并行执行表达式的引擎上将具有比那些不并行执行表达式的引擎更好的性能。
这类似于询问排序的最佳情况。有些人会告诉你O(n log n)
,但他们会错的。答案取决于使用的算法。有些种类(例如radix sort)的最差情况为O(n)
。
答案 1 :(得分:0)
实际的复杂性可能取决于具体的正则表达式。 1000000'a的简单匹配大约需要10秒钟:
import re
expr = 'a' * 1000000
re.match(expr, expr)
这种情况下的复杂性似乎与O(m)有关,但更复杂的表达肯定会花费更长的时间。