gpt4 book ai didi

java - 如何在 Java 中实现随机 O(n) 算法来查找未排序数组的中位数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:07:27 24 4
gpt4 key购买 nike

我有这段代码用于在 O(n) 预期时间、O(n^2) 最坏情况下查找未排序数组的中位数。我使用 long 是因为我希望能够保存 long 值。

public class Randomized {

long kthSmallestHelper(long arr[], long l, long r, long k)
{
if (k > 0 && k <= r - l + 1)
{
long pos = randomPartition(arr, l, r);

if (pos-l == k-1)
return arr[(int)pos];

if (pos - l > k - 1)
return kthSmallestHelper(arr, l, pos - 1, k);

return kthSmallestHelper(arr, pos + 1, r, k - pos + l - 1);
}
return Integer.MAX_VALUE;
}

void swap(long arr[], long i, long j)
{
long temp = arr[(int)i];
arr[(int)i] = arr[(int)j];
arr[(int)j] = temp;
}

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

long randomPartition(long arr[], long l, long r)
{
long n = r - l + 1;
long pivot = (long)(Math.random()) * (n - 1);
swap(arr, pivot + 1, r);
return partition(arr, l, r);
}

long kthSmallestRandom(long arr[], long k){
return kthSmallestHelper(arr, 0, arr.length - 1, k);

}

}

但是当我运行它的时候

    long[] array =  {12, 3, 5, 7, 4, 19, 26}; //median is 7
Randomized rand = new Randomized();
System.out.println(rand.kthSmallestRandom(array, (array.length + 1)/2));

不正确(它返回 4)。

我的想法是使用这个版本的第 k 个最小数字来表示我想要第 (length/2) 个最小的数字,即中位数。

我的想法或实现有什么问题?

最佳答案

您的 kthSmallestHelper 函数在这一行中有一个小错误:

if (pos-l == k-1) 
return arr[(int)pos];

返回使用了错误的索引。尝试使用 pos-l+1 而不是 pos(并将其转换为 int)。这将返回第 k 个项目,它刚刚被排序到数组中的正确位置。

关于java - 如何在 Java 中实现随机 O(n) 算法来查找未排序数组的中位数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55005525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com