isSubstring(s1,s2)复杂度(语言不可知方法)

时间:2018-10-19 04:27:17

标签: algorithm substring

我刚刚读过一本概念性的书:

isString(sring s1, string s2)

可以假定为O(A + B),其中A是s1的大小,B是S2的大小。

有人可以告诉这个假设来自何处吗?

我的逻辑: 如果我们假设A> B,则可以进行A-B窗口搜索。 假设我们一找到就退出。 假设情况更糟,每次序列中的最后一个字符为假。 (不确定是否存在这样的顺序) 因此,我们在对单个窗口进行B-1比较后退出。 综上所述,我们的总操作次数应为A-B * B-1。 这是正确的逻辑还是我很累,应该睡觉))))) 请让我知道。

2 个答案:

答案 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或双向字符串匹配算法。