- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用中位数中位数枢轴方法实现第 k 个选择算法。具体来说,我正在关注 pseudocode listed here. .但是,我的代码崩溃了(下面讨论的错误),我知道它崩溃的原因,但我不明白我能做些什么。
错误
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 32017219
at Selection.partition(Selection.java:173)
原因
在 wiki 链接中,如果 left == right
,select
方法将返回一个值。但是,当从 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;
}
我完全理解为什么我的代码不工作,我只是不明白如何修复它,因为它看起来正是算法指定的。非常感谢您的指点!
最佳答案
有不少错误:
方法pivot
不应修改数组 a
.它应该为 future 找到一个支点partition
.一个肮脏的修复是调用 pivot(a.clone(), left, right);
. (你不应该这样做,只是为了给你一个想法。)
Math.ceil((right - left) / 5)
是整数除法。您应该将它们转换为 float :Math.ceil(((float)(right - left)) / 5f)
.
在 partition5
,你对整个数组 a
进行排序!您应该只进行比较以找到 a[left]
之间的中位数索引和 a[right]
.
有时您可能会得到 right < left
, 所以第一行 alg5
你应该写 if (left >= right)
关于java - Median of Medians 算法错误的中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30443146/
我已经在 python 中编写了这个中位数算法的实现,但它似乎没有输出正确的结果,而且它对我来说似乎也不是线性复杂度,知道我在哪里偏离轨道了吗? def select(L): if len(L
我正在使用中位数中位数枢轴方法实现第 k 个选择算法。具体来说,我正在关注 pseudocode listed here. .但是,我的代码崩溃了(下面讨论的错误),我知道它崩溃的原因,但我不明白我能
我想将中位数算法应用于 35 个元素的列表 3 7 4 6 9 12 11 4 5 6 8 2 7 11 23 12 4 7 3 9 8 4 5 6 3 2 1 9 9 3 4 5 6 1 14 T(
作为家庭作业,我被分配编写算法,从无序数字集中找到第 k 个有序数字。作为一种方法,提出了算法中位数的中位数。 不幸的是,我的尝试失败了。如果有人发现错误 - 请纠正我。 private int fi
我已经明白了 我知道中位数算法的中位数(我将表示为 MoM)是一个高常数因子 O(N) 算法。它找到 k 组(通常为 5)的中位数,并将它们用作下一次迭代的集合以查找的中位数。找到它后的基准将在原始集
我的 Java 代码有问题...我已经盯着它看了 10 多个小时,但我就是找不到我犯的错误。 我的任务是实现“中位数的中位数”算法,将数组拆分为最大长度为 5 的数组并查找它们的中位数。然后查找这些中
我想通过以下示例了解“中位数的中位数”算法: 我们有 45 个不同的数字,分为 9 组,每组有 5 个元素。 48 43 38 33 28 23 18 13 8 49 44 39 34 29 24 1
CLRS 第 3 版第 9.3 节“最坏情况线性时间的选择”讨论了“选择”算法(由于 Blum、Floyd、Pratt、Rivest 和 Tarjan,有时称为 BFPRT 算法)用于查找 a 的中值
我正在搜索 John Tukey 算法,该算法使用 R 在我的线性回归上计算“阻力线”或“中值-中值线”。 邮件列表上的一位学生用这些术语解释了这个算法: "The way it's calculat
我的问题正如我在标题中指定的那样:test_median.cpp: In function ‘int main()’: test_median.cpp:26:27: error: cannot con
我正在实施quicksort,我希望将枢轴设置为中位数或三位数。这三个数字是第一个元素,中间元素和最后一个元素。 我能不能找到中位数呢?比较? median(int a[], int p, int r
自从最新的 R 更新以来,我得到了 Note summary.xmlImport: no visible global function definition for ‘median’ 在 CRAN
我使用 Medians of Medians 实现了第 nth_number 选择算法。在 wikipedia ,它指出它的空间复杂度是 O(1) 我必须将中位数存储在一个临时数组中,以便在这些中位数
中位数的中位数 方法在quicksort 类型的分区算法中非常流行,可以产生相当好的主元,从而均匀地分区数组。其逻辑在维基百科中给出为: The chosen pivot is both less t
我正在尝试将使用第一个元素作为基准的快速排序程序修改为使用三个中位数(第一个、最后一个和中间元素的中位数)作为基准的快速排序。然而,到目前为止,我的实现在测试时给出了 ArrayIndexOutOfB
我有一个关于 numpy.median() 在使用 numpy.ma.masked_array() 创建的屏蔽数组上的行为的问题。 正如我从调试自己的代码中了解到的那样,numpy.median()
给定两个具有唯一整数元素的数组,即元素在两个数组内或两个数组之间重复: 这是我编写的递归算法,需要帮助来破译我收到的错误消息。 public class Median { public static
在屏蔽数组的情况下,我对 numpy.median 的输出有点困惑。这是一个简单的示例(假设导入了 numpy - 我的版本是 1.6.2): >>> a = [3.0, 4.0, 5.0, 6.0,
有关问题的详情如下:。我期待中位数来一些价值,但它是未来0每一次,我总是得到一个不正确的模式。
有关问题的详情如下:。我期待中位数来一些价值,但它是未来0每一次,我总是得到一个不正确的模式。
我是一名优秀的程序员,十分优秀!