我想使用Divide-and-Conquer程序计算一行整数中的第i个最大元素,并分析算法的渐近时间复杂度。
Algorithm ith(A,low,high){
q=partition(A,low,high);
if (high-i+1==q) return A[q];
else if (high-i+1<q) ith(A,low,q-1);
else ith(A,q+1,high);
}
是不是?如果是这样,我们怎么能找到它的时间复杂度?
时间复杂度由以下递归关系描述:
T(N)= T(N-Q)+ T(Q-1)+Θ(n)的
但是如何在不知道q的值的情况下解决这种递归关系呢?
或者是否有一个时间复杂度较低的算法来计算一行整数的第i个最大元素?
答案 0 :(得分:0)
这是quick select算法的变体(找到i-th
最小元素而不是i-th
最大元素)。在最坏的情况下,它的运行时间为O(n^2)
,在平均情况下为O(n)
。
要查看最坏的情况,假设您正在搜索nth
最大元素,并且算法总是选择q
作为剩余范围中的最大元素。所以你将调用ith
函数n
次。此外,分区子例程需要O(n)
,因此总运行时间为O(n^2)
。
要了解平均案例分析,请查看Tim Roughgarden教授here给出的解释。