我刚刚读过一本概念性的书:
isString(sring s1, string s2)
可以假定为O(A + B),其中A是s1的大小,B是S2的大小。
有人可以告诉这个假设来自何处吗?
我的逻辑: 如果我们假设A> B,则可以进行A-B窗口搜索。 假设我们一找到就退出。 假设情况更糟,每次序列中的最后一个字符为假。 (不确定是否存在这样的顺序) 因此,我们在对单个窗口进行B-1比较后退出。 综上所述,我们的总操作次数应为A-B * B-1。 这是正确的逻辑还是我很累,应该睡觉))))) 请让我知道。
答案 0 :(得分:2)
对于固定字符集,Ukkonen's algorithm可以在s1
的时间计算O(A)
中的Suffix Tree。验证s2
是否为子字符串是验证其是否为有效后缀的问题。遍历需要时间O(B)
。从而导致O(A + B)
时间。
天真算法,如您所描述的慢得多。
答案 1 :(得分:1)
您的假设是错误的,因为如果发生故障,您可以知道下一个可能的窗口是什么。假设您有:ABCDEABD并查找ABD,然后将ABD放在ABC下,观察到C和D不匹配,那么此时您知道AB匹配,因此在BCD下查看ABD或ABD都没有用在CDE中,查看它的唯一下一个有用位置是在DEA中。在匹配的字符串上进行简单的预计算就足以计算位移。这是许多strin-matchin算法的基础。看看Perrin和Crochemore的Boyer-Moore或双向字符串匹配算法。