string.matches的复杂性是什么?

时间:2014-12-16 20:18:52

标签: java time-complexity

示例代码,我尝试验证字符串是否为有效的整数

 public static boolean isValidNumberUsingRegex(String num) {
        return num.matches("[-+]?\\d+(\\.\\d+)?");
    }

matches的时间复杂度是多少?

2 个答案:

答案 0 :(得分:5)

这取决于正则表达式引擎的实现。假设没有任何真正笨拙的发生(例如,在这个正则表达式中不应该有回溯函数),我会说你的表达式产生的DFA会接受/拒绝O(n)中的任何字符串。 / p>

这里描述了Regexper的表达式:

enter image description here

请注意,没有办法说明一般正则表达式的复杂性。一些正则表达式需要回溯,你可以制作指数时间匹配的表达式。所以我的回答适用于这个特定的表达式,这个特定的表达式(实际上是任何特定的表达式)被编译成O(1)中的DFA。

答案 1 :(得分:0)

通常在正则表达式实现中,在构造模式时构造DFA,然后使用该DFA来匹配给定的字符串。

如果按原样保留方法,它可能一直接近O(n * m),其中n是模式的长度,m是字符串的长度,因为DFA需要每次建造。另一方面,如果您使用Pattern类预编译DFA,那么您可以获得更好的结果。

就复杂性而言,一旦预编译了模式,就应该采用以下复杂性:

在匹配时,至少需要O(m)时间,其中m是字符串的长度

在不匹配(非数字)上,您可以在O(1)和O(m-1)之间的任何时间实现,具体取决于模式从DFA中脱落的位置。

如果您对如何创建DFA感兴趣,建议您观看此视频。我发现学习时很有帮助:

https://www.youtube.com/watch?v=dlH2pIndNrU