Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 这个正则表达式模式匹配的时间复杂度是多少?_Python_Regex - Fatal编程技术网

Python 这个正则表达式模式匹配的时间复杂度是多少?

Python 这个正则表达式模式匹配的时间复杂度是多少?,python,regex,Python,Regex,在python中: word = "hello" yes = re.search("h.llo", word) 这个正则表达式搜索的复杂性是什么 我试图理解正则表达式的计算方式是否会有所不同,而不是说只将26个字母作为“.”并将其与单词进行比较。如果是这样的话,它会如何做呢 *编辑:word变量是函数中的输入,不是直接定义的它取决于实现。许多正则表达式库将在有限自动机上使用一个变体,它将在O(| word |)到O(| word |*| regex |)

在python中:

word = "hello"
yes = re.search("h.llo", word)
这个正则表达式搜索的复杂性是什么

我试图理解正则表达式的计算方式是否会有所不同,而不是说只将26个字母作为“.”并将其与单词进行比较。如果是这样的话,它会如何做呢


*编辑:
word
变量是函数中的输入,不是直接定义的

它取决于实现。许多正则表达式库将在有限自动机上使用一个变体,它将在
O(| word |)
O(| word |*| regex |)
时间中匹配上述正则表达式。他们中没有一个人会“尝试26个字母”,因为
实际上匹配任何东西,而不是字母数字,这将很快变得非常慢(如何通过计算所有可能的字符串来匹配
*


我猜大多数实现只会使用5-9个总比较来确定单词是否匹配。

时间复杂度通常是指根据变量大小和任意大的输入执行的基本操作的数量(例如,传递给
重新搜索的文本)。它通常表示为O(),其中表达式涉及输入大小n,示例为O(n)或O(n^2)。因为在您的案例中,文本是预先知道的,所以搜索的时间复杂度在技术上是恒定的,即O(1)

如果没有预先给出输入文本,时间复杂度将为O(n),这意味着最坏情况下执行的操作数将与文本大小成线性比例。线性缩放的常数,这就是你要问的,不是时间复杂性通常关心的问题


一个有能力的正则表达式引擎不会尝试26次比较(事实上是256次,因为
匹配非字母,或者谁知道有多少次将Unicode考虑在内)来匹配
,它只是不会将字符串中的字母与模式中的任何内容进行比较。

我明白了!我不熟悉有限自动机,但我可以假设,本质上,正则表达式通常使用一些复杂的算法来进行排列,这样它就可以使它成为线性时间,而不是阶乘(“手动”排列)。比如说,如果我试图搜索一个带点的模式,换句话说,这里的时间复杂度是多少?我认为这将取决于图案中点的数量,也取决于单词中字母的数量。@FryingPan时间复杂性并不意味着你认为它意味着什么,请参阅我的答案以获得简短概述。此外,点的数量不会使模式更难匹配,如果有什么不同的话,它会使匹配更容易,因为一些字符不需要进行比较。另一方面,像
*
这样的东西确实会使模式更难匹配,因为在最坏的情况下它需要任意回溯-也许你是指这个?