【问题标题】:Randomized-select kth largest element随机选择第 k 个最大元素
【发布时间】:2018-09-21 16:01:42
【问题描述】:

我最近一直在研究算法,并进入了随机选择算法。我试图弄清楚,偶然发现了这个网站

https://www.geeksforgeeks.org/kth-smallestlargest-element-unsorted-array-set-2-expected-linear-time/

其中显示了一个代码,几乎没有解释它是如何工作的。

它可以找到第 k 个最小的元素,但是如何更改它以显示第 k 个最大的元素?

特别是这个方法

    int kthSmallest(int arr[], int l, int r, int k)
{
    // If k is smaller than number of elements in array
    if (k > 0 && k <= r - l + 1)
    {
        // Partition the array around a random element and
        // get position of pivot element in sorted array
        int pos = randomPartition(arr, l, r);

        // If position is same as k
        if (pos-l == k-1)
            return arr[pos];

        // If position is more, recur for left subarray
        if (pos-l > k-1)
            return kthSmallest(arr, l, pos-1, k);

        // Else recur for right subarray
        return kthSmallest(arr, pos+1, r, k-pos+l-1);
    }

    // If k is more than number of elements in array
    return Integer.MAX_VALUE;
}

【问题讨论】:

  • to show the kth largest element? 只需寻找length-k-th 最小

标签: java algorithm


【解决方案1】:

您不必修改此方法kthSmallest。相反,您应该修改方法partition(取自您提供的链接):

int partition(int arr[], int l, int r)
{
    int x = arr[r], i = l;
    for (int j = l; j <= r - 1; j++)
    {
        if (arr[j] >= x)
        {
            swap(arr, i, j);
            i++;
        }
    }
    swap(arr, i, r);
    return i;
}

我在这里更改了 if 语句:if (arr[j] &lt;= x)if (arr[j] &gt;= x)

【讨论】:

  • 谢谢。我一直在想我必须在第一个函数上改变一些东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2015-10-06
  • 1970-01-01
  • 2021-08-29
  • 2011-01-09
  • 1970-01-01
  • 2010-12-18
相关资源
最近更新 更多