查找算法的平均情况复杂度
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
.
算法的平均时间复杂度是当输入为任意序列时,算法执行的预期时间。根据定义,
下图显示了n
和p
搜索数组的时间变化情况。
我有一个未排序数组的顺序搜索算法:
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
.
算法的平均时间复杂度是当输入为任意序列时,算法执行的预期时间。根据定义,
下图显示了n
和p
搜索数组的时间变化情况。