gpt4 book ai didi

java - Median of Medians 算法错误的中位数

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

我正在使用中位数中位数枢轴方法实现第 k 个选择算法。具体来说,我正在关注 pseudocode listed here. .但是,我的代码崩溃了(下面讨论的错误),我知道它崩溃的原因,但我不明白我能做些什么。

错误

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 32017219
at Selection.partition(Selection.java:173)

原因
在 wiki 链接中,如果 left == rightselect 方法将返回一个。但是,当从 pivot 的 return 语句调用相互递归时,这意味着它将返回一个值(而不是索引)给父级,父级将该值设置为 >枢轴索引

代码

public static int alg5(int[] a, int left, int right, int k) {
if (left == right) {
return a[left];
}

while (true) {
int pivotIndex = pivot(a, left, right);
pivotIndex = partition(a, left, right, pivotIndex);

if (k == pivotIndex) {
return a[k];
} else if (k < pivotIndex) {
right = pivotIndex - 1;
} else {
left = pivotIndex + 1;
}

}
}

public static int pivot(int[] a, int left, int right) {
for (int i = left; i <= right; i = i + 5) {
int subRight = i + 4;
if (subRight > right) {
subRight = right;
}

int median5 = partition5(a, i, subRight);
swap(a, median5, (int)(Math.floor(i / 5)));
}

return alg5(a, left, (int)(left + Math.ceil((right - left) / 5) - 1), ((right - left) / 10));
}

public static int partition5(int[] a, int left, int right) {
Arrays.sort(a);

return ((a.length - 1) / 2);
}

public static int partition(int[] a, int left, int right, int pivotIndex) {
int pivotValue = a[pivotIndex];
a = swap(a, pivotIndex, right);
int storeIndex = left;

for (int i = left; i <= right; i++) {
int aOfi = a[i];
if (a[i] < pivotValue) {
swap(a, storeIndex, i);
storeIndex++;
}
}

swap(a, right, storeIndex);

return storeIndex;
}

我完全理解为什么我的代码不工作,我只是不明白如何修复它,因为它看起来正是算法指定的。非常感谢您的指点!

最佳答案

有不少错误:

  1. 方法pivot不应修改数组 a .它应该为 future 找到一个支点partition .一个肮脏的修复是调用 pivot(a.clone(), left, right); . (你不应该这样做,只是为了给你一个想法。)

  2. Math.ceil((right - left) / 5)是整数除法。您应该将它们转换为 float :Math.ceil(((float)(right - left)) / 5f) .

  3. partition5 ,你对整个数组 a 进行排序!您应该只进行比较以找到 a[left] 之间的中位数索引a[right] .

  4. 有时您可能会得到 right < left , 所以第一行 alg5你应该写 if (left >= right)

关于java - Median of Medians 算法错误的中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30443146/

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