查找算法的平均情况复杂度

Finding the Average case complexity of an Algorithm

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

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

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

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

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

更正式地说,设 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 iff x=n 否则 0 .

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

下图显示了np搜索数组的时间变化情况。