【问题标题】:Find the i-th greatest element找到第 i 个最大的元素
【发布时间】:2015-06-02 05:05:25
【问题描述】:

我想使用分治法计算一行整数中的第 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 个最大元素?

【问题讨论】:

  • “时间复杂度”是什么意思?平均,最坏情况,还有别的吗?然后可以确定正确的递推关系。无论您感兴趣的是什么版本的“时间复杂度”,您对递归关系的了解目前都是错误的。

标签: algorithm divide-and-conquer recurrence


【解决方案1】:

这是quick select 算法的变体(它找到i-th 最小元素而不是i-thgreatest 元素)。它的运行时间在最坏情况下为O(n^2),在平均情况下为O(n)

要查看最坏的情况,假设您正在搜索 nth 最大元素,并且算法总是选择 q 作为剩余范围中的最大元素。所以你将调用ith 函数n 次。此外,分区子程序占用O(n),因此总运行时间为O(n^2)

要了解平均案例分析,请查看Tim Roughgarden教授here的解释。

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 2019-05-31
    • 2021-06-04
    • 2012-10-22
    • 2013-01-19
    • 2022-12-31
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多