朴素精确算法中字符比较的精确数目
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)
,当进行所有可能的比较时。最好的情况是 N
和 M-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.
给定一个子串和一个字符串,是否可以计算 精确 字符比较的次数 运行 朴素的精确算法将子串匹配到给定的字符串?假设完全匹配,没有近似匹配。
根据许多来源(例如,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)
,当进行所有可能的比较时。最好的情况是 N
和 M-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.