给定子字符串和字符串,是否可以计算运行朴素精确算法以使子字符串与给定字符串匹配时所做的字符比较的精确数量?假设完全匹配,没有近似匹配。
根据许多来源(例如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
,但我们都指的是同一件事(我只是与之前的网址链接保持一致)。
在任何情况下,这都让我想知道在运行朴素精确算法时是否有可能准确计算出多少字符比较。如果我们能够知道最坏的情况,并且我们可以大致猜测大约进行了多少次字符比较,那么肯定必须有一种方法来计算完全进行了多少次字符比较。
答案 0 :(得分:0)
假设搜索是使用字符串长度的外部循环和子字符串长度的内部循环执行的,您将执行
如果搜索在.menu li.active
个位置成功,则完全I
比较(N.I
);
如果搜索失败,则完全1≤I≤M-N+1
次比较,其中ΣJk
是子字符串前缀中匹配字符的数量加一(Jk
)。
如上所述,最糟糕的情况是1≤Jk≤N
,当进行所有可能的比较时。最好的情况是,当在第一个位置找到子字符串时,N(M-N+1)
的最小值和N
,当所有子字符串比较立即失败时。
假设失败的概率是M-N+1
而成功q
的概率,所有位置和所有匹配的前缀长度都是等概率的(如果可能的话),预期的数字是
p