朴素精确算法中字符比较的精确数目

Exact number of character comparisons in naive exact algorithm

给定一个子串和一个字符串,是否可以计算 精确 字符比较的次数 运行 朴素的精确算法将子串匹配到给定的字符串?假设完全匹配,没有近似匹配。

根据许多来源(例如,http://www.di.unipi.it/~pisanti/DIDATTICA/patternmatching1.pdf),可以使用 Big-Oh 表示法计算最坏情况下的比较次数:O(nm)。即,最坏的情况是:n(m-n+1),其中 n 是要与字符串 m.

匹配的子串的长度

但是,以下来源指出在朴素的精确算法中大致进行了 m 次比较:http://www.cs.cornell.edu/courses/cs312/2002sp/lectures/lec25.htm。请注意,他们在表示法中使用 n 而不是 m,但我们的意思相同(我只是与之前的 URL link 保持一致)。

无论如何,这一切让我想知道在 运行 朴素的精确算法时是否可以准确计算出进行了多少字符比较。如果我们知道最坏的情况,并且我们可以大致猜测大约进行了多少次字符比较,那么肯定有一种方法可以准确地计算进行了多少次字符比较。

假设搜索是在字符串长度上进行外循环,在子串长度上进行内循环,你将执行

  • 如果在第 I 个位置搜索成功,正好 N.I 次比较 (1≤I≤M-N+1);

  • 若查找失败,则进行ΣJk次比较,其中Jk为子串前缀匹配字符数加一(1≤Jk≤N).

如前所述,最坏的情况是 N(M-N+1),当进行所有可能的比较时。最好的情况是 NM-N+1 中的最小值,当在第一个位置找到子字符串时,所有子字符串比较立即失败。

假设失败的概率为 q,成功的概率为 p,所有位置和所有匹配的前缀长度都是等概率的(如果可能的话),则预期数字为

p.N(M-N+2)/2 + q.(N+1)(M-N+1)/2 = N(M-N+2)/2 + q(M-1)/2.