第一个想法。您可以确定n
字符串的长度O(log2(n))
。
- 检查
Z*
whereZ
表示k
问号,从 0 开始,然后是 1,然后每次检查都将问号的数量加倍,直到不匹配。n
必须在k / 2
和之间k
k
使用与二进制搜索相同的方式更改相同的模式找到确切的长度。
知道确切的长度可能有助于在空间域中执行一种分而治之的方法。
更新
如果您知道长度,则可以使用相同的模式来正确定位符号。
例子:
..X。..XX(为便于阅读添加了空格)
+ 符号可能是 X
- 符号不是 X
X 符号是 X
*X* => 匹配 ++++ ++++
*X* ????=> 匹配 ++++ ++++
*X*?????=> 不匹配 --++ ++++
??X????=> 匹配 --X+ ++++
??XX???? => 不匹配 --X- ++++
??X?*X*??=> 不匹配 --X- --++
??X???X?=> 匹配 --X- --X+
??X???XX => 匹配 --X- --XX
对于字符串长度n
和字母大小,m
这将需要O(log2(n))
找到字符串的长度,O(n • log2(n))
正确放置n
符号,并O(m)
找到使用的符号 - 将所有符号加在一起产生O(n • log2(n) + m)
。
我可以想象,可以通过合并几个步骤来加快速度 - 可能在确定字符串长度的同时测试使用的符号,或者同时在字符串的前半部分和后半部分定位两个(甚至更多?)符号。如果检查失败,这将需要单独重新检查合并的步骤,以确定哪个检查失败。但只要合并检查成功,您就可以获得两者的信息。
也许我明天会计算一下,看看它是否真的会加快速度。