编辑:哎呀!大承认,我搞砸了?
infnmatch
模式语法的定义,似乎已经提出(并且可能解决了)一个更困难的问题,它的行为就像.?
在正则表达式中一样。当然,它实际上应该表现得像.
正则表达式(只匹配一个字符,而不是零或一)。这反过来意味着我最初的减少问题的工作足以解决(现在相当无聊的)原始问题。解决更难的问题仍然很有趣。有时间我可能会写出来。
从好的方面来说,这意味着像 2way/SMOA 针分解这样的东西更有可能适用于这些模式,这反过来可能会产生比最初想要的O(n)
甚至更好的O(n/m)
性能。
在问题标题中,设m
图案/针n
的长度和与之匹配的字符串的长度。
我对这个问题很感兴趣,因为我见过/使用的所有算法要么性能不佳,要么由于回溯而可能存在堆栈溢出漏洞,或者需要动态内存分配(例如,对于 DFA 方法或只是避免在调用上进行回溯stack),因此如果程序fnmatch
用于授予/拒绝某种访问权限,则失败情况也可能很危险。
我愿意相信正则表达式匹配不存在这样的算法,但文件名模式语言比正则表达式简单得多。我已经将问题简化到可以假设模式不使用*
字符的程度,并且在这个修改后的问题中,您不是匹配整个字符串,而是在字符串中搜索模式的出现(如子字符串匹配问题)。如果进一步简化语言并去掉?
字符,语言只是由固定字符串和括号表达式的串联组成,这可以很容易地在O(mn)
时间和 O(1) 空间上匹配,也许可以改进为O(n)
如果 2way 和 SMOA 子字符串搜索中使用的针分解技术可以扩展到这种括号模式。然而,天真地每个都?
需要使用或不?
使用字符的试验,带来一个时间因素,2^q
即模式中的字符q
数。?
任何人都知道这个问题是否已经解决,或者有解决它的想法?
注意:在定义 O(1) 空间时,我使用的是Transdichotomous_model。
注 2:本网站详细介绍了我引用的 2way 和 SMOA 算法:http ://www-igm.univ-mlv.fr/~lecroq/string/index.html