不了解中位数算法以找到第k个元素

伊曼纽尔·穆迪(Emmanuel Mudiay)

下面是我的代码,用于尝试了解中位数算法的中位数(使用大小为5的块)。我知道如何获取输入的中位数,但是我不确定如何对块进行编码以保持递归输入,直到获得中位数为止。然后,在获得中位数之后,我不确定如何将其用作枢轴以丢弃无用的信息来划分输入。getMediansArray返回大小为ceil(input.length / 5)的数组,并且getMedians仅返回数组的中位数(仅用于长度<= 5的数组)。

public static int[] findKthElement(int[] input, int k) {
    int numOfMedians = (int) Math.ceil(input.length/5.0);
    int[] medians = new int[numOfMedians];
    medians = getMediansArray(input, medians)

    // (1) This only gets the first iteration of medians of the
    // input. How do I recurse on this until I just have one median?

    // (2) how should I partition about the pivot once I get it?
}

public static int[] getMediansArray(int[] input, int[] medians) {
    int numOfMedians = (int) Math.ceil(input.length/5.0);
    int[] five = new int[5];

    for (int i = 0; i < numOfMedians; i++) {
        if (i != numOfMedians - 1) {
            for (int j = 0; j < 5; j++) {
                five[j] = input[(i*5)+j];
            }
            medians[i] = getMedian(five);
        } else {
            int numOfRemainders = input.length % 5;
            int[] remainder = new int[numOfRemainders];
            for (int j = 0; j < numOfRemainders; j++) {
                remainder[j] = input[(i*5)+j];
            }
            medians[i] = getMedian(five);
        }
    }
    return medians;
}

public static int getMedian(int[] input) {
    Arrays.sort(input);
    if (input.length % 2 == 0) {
        return (input[input.length/2] + input[input.length/2 - 1]) / 2;
    }
    return input[input.length/2];
}
内斯里克

中位数的中位数基本上只是改进的快速选择算法(http://en.wikipedia.org/wiki/Quickselect)。快速选择的平均时间复杂度为O(n),但对于棘手的输入,它可能会降低到O(n ^ 2)。

找到中位数的中位数后,您要做的只是快速选择算法的迭代。中位数的中位数具有很好的属性,它将始终大于30%的元素并且小于30%的元素。这保证了使用中位数的中位数作为枢轴的快速选择将在最差的O(n)时间复杂度下运行。请参阅:http : //en.wikipedia.org/wiki/Median_of_medians

我建议您从实现快速选择开始。完成此操作后,您可以使用已经在快速选择的每个步骤中选择数据透视的代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解两个排序数组中位数的算法

来自分类Dev

Haskell-从末尾找到第k个元素,而Haskell的模式不匹配

来自分类Dev

快速选择算法以找到第k个最小数的实现

来自分类Dev

快速选择算法以找到第k个最小数的实现

来自分类Dev

在n个元素列表中的中位数

来自分类Dev

部分排序以找到第k个最大/最小元素

来自分类Dev

在O(log n)中找到第k个最小元素

来自分类Dev

部分排序以找到第k个最大/最小元素

来自分类Dev

分而治之-找到包含唯一元素的两个大小相等的数组之间的中位数?

来自分类Dev

算法找到第n个车厢

来自分类Dev

找到第n个素数的更好算法?

来自分类Dev

在单链接列表中找到倒数第3个元素-算法

来自分类Dev

第n个K数的最佳算法

来自分类Dev

在链接列表的最后一个元素中找到第k个

来自分类Dev

从两个排序的数组中找到第k个最小的元素

来自分类Dev

算法约简(中位数,快速排序)

来自分类Dev

快速排序算法-中位数三

来自分类Dev

带有“三个中位数”枢轴选择的Quicksort:了解过程

来自分类Dev

使用“基于元素的K个数组的排列数”算法,数组中第K个最大数

来自分类Dev

使用高阶遍历函数找到有序遍历的第k个元素后中断

来自分类Dev

向数组中插入绝对差后,找到数组中的第k个最大元素

来自分类Dev

通过随机枢轴法找到第K个最小元素。一些奇怪的错误

来自分类Dev

如何在不对列表进行排序的情况下找到列表的第k个最小元素?

来自分类Dev

使用高阶遍历函数找到有序遍历的第k个元素后中断

来自分类Dev

查找2个大小相同的数组的中位数-O(log n)算法无法得出正确的结果

来自分类Dev

简单查询:SortedSet <T>是否有找到中位数元素的简便方法?

来自分类Dev

找到满足条件的第n个元素?

来自分类Dev

如何找到分组的SQL中位数

来自分类Dev

Tensorfow.js找到张量的中位数

Related 相关文章

  1. 1

    了解两个排序数组中位数的算法

  2. 2

    Haskell-从末尾找到第k个元素,而Haskell的模式不匹配

  3. 3

    快速选择算法以找到第k个最小数的实现

  4. 4

    快速选择算法以找到第k个最小数的实现

  5. 5

    在n个元素列表中的中位数

  6. 6

    部分排序以找到第k个最大/最小元素

  7. 7

    在O(log n)中找到第k个最小元素

  8. 8

    部分排序以找到第k个最大/最小元素

  9. 9

    分而治之-找到包含唯一元素的两个大小相等的数组之间的中位数?

  10. 10

    算法找到第n个车厢

  11. 11

    找到第n个素数的更好算法?

  12. 12

    在单链接列表中找到倒数第3个元素-算法

  13. 13

    第n个K数的最佳算法

  14. 14

    在链接列表的最后一个元素中找到第k个

  15. 15

    从两个排序的数组中找到第k个最小的元素

  16. 16

    算法约简(中位数,快速排序)

  17. 17

    快速排序算法-中位数三

  18. 18

    带有“三个中位数”枢轴选择的Quicksort:了解过程

  19. 19

    使用“基于元素的K个数组的排列数”算法,数组中第K个最大数

  20. 20

    使用高阶遍历函数找到有序遍历的第k个元素后中断

  21. 21

    向数组中插入绝对差后,找到数组中的第k个最大元素

  22. 22

    通过随机枢轴法找到第K个最小元素。一些奇怪的错误

  23. 23

    如何在不对列表进行排序的情况下找到列表的第k个最小元素?

  24. 24

    使用高阶遍历函数找到有序遍历的第k个元素后中断

  25. 25

    查找2个大小相同的数组的中位数-O(log n)算法无法得出正确的结果

  26. 26

    简单查询:SortedSet <T>是否有找到中位数元素的简便方法?

  27. 27

    找到满足条件的第n个元素?

  28. 28

    如何找到分组的SQL中位数

  29. 29

    Tensorfow.js找到张量的中位数

热门标签

归档