查找算法的平均大小写复杂度

时间:2017-02-17 01:26:16

标签: arrays algorithm time-complexity complexity-theory asymptotic-complexity

我有一个顺序搜索未排序数组的算法:

SequentialSearch(A[0..n-1],K)

i=0
while i < n and A[i] != K do
    i = i+1
if i < n then return i
else return -1

我们有一个输入数组A[0...n-1]和一个搜索键K

我知道最糟糕的情况是n,因为我们必须搜索整个数组,因此n项O(n)

我知道最好的情况是1,因为这意味着我们搜索的第一个项目是我们想要的项目,或者数组具有所有相同的项目,无论哪种方式都是O(1)

但我不知道如何计算平均情况。我的教科书给出的答案是:

= (p/n)[1+2+...+i+...+n] + n(1-p)

当我看到像这样的算法时,我可以遵循一个通用公式来计算它吗?

下面的图片 Textbook example

3 个答案:

答案 0 :(得分:3)

= (p/n)[1+2+...+i+...+n] + n(1-p)

p这里是在数组中找到搜索键的概率,因为我们有n个元素,我们有p/n作为在特定索引内找到键的概率n。我们基本上在每次迭代中进行加权平均,我们在1比较,2比较和直到n比较中权衡。因为我们必须考虑所有输入,所以第二部分n(1-p)告诉我们数组1-p中不存在输入的概率。当我们搜索整个数组时,需要n

答案 1 :(得分:1)

您需要考虑输入案例,类似于输入的等价类,这取决于算法的上下文。如果这些事情都不知道,那么假设输入是一个随机整数数组,平均情况可能是O(n)。这是因为,粗略地说,您无法在有用的范围内证明在〜-32k到~32k范围内的N个整数值数组中查找查询的频率。

答案 2 :(得分:0)

更正式地说,让X是一个离散的随机变量,表示需要扫描的数组A的元素数。有n个元素,因为所有位置对于随机生成的输入都同样可能,X ~ Uniform(1,n)其中X = 1,..,n,因为在数组中找到了搜索关键字(概率为p) ,否则需要使用X=n(概率1-p)扫描所有元素。

因此,P(X=x)=(1/n).p.I{x<n}+((1/n).p+(1-p)).I{x=n}x = 1,..,n,其中I{x=n}是指标函数,如果1 x=n,则0值为n

算法的平均时间复杂度是当输入是任意序列时执行算法所需的预期时间。根据定义,

enter image description here

下图显示了搜索数组所花费的时间如何随p和{{1}}的变化而变化。

enter image description here