最大堆查找第 k 个最小元素

用户7722505

任务:

你有一个未排序的元素列表,在我们的例子中是整数,你必须找到该列表中第 k 个最小的元素。显而易见的想法当然是按升序对列表进行排序并返回第k个最小的元素。这应该在 O(N Log N) 中完成。

我试图找到我使用最大堆的第 k 个最小元素。据我了解,我需要按递增顺序对数组进行排序,并在获得第 k 个最小元素时返回。如果我理解正确,最大堆最好用于按递增顺序对数组进行排序,但最小堆用于查找第 k 个最小元素。这是不明白的地方。如何按升序对数组进行排序并返回第 k 分钟?如果我使用最大堆,我在找出如何获得第 k 个最小元素时遇到问题,因为等待数组完全排序是没有意义的,然后用 for 循环遍历它并获得第 k 个最小元素,因为不会使 HeapSort O(N log N) 因为它需要另一个 for 循环来遍历数组。如果我使用最小堆,它将是降序的。

这是最大堆如何按递增顺序对数组进行排序:

最大堆制作:[10, 9, 8, 5, 1, 8, 3, 5, 5, 1]

[9, 5, 8, 5, 1, 8, 3, 1, 5, 10]

[8, 5, 8, 5, 1, 5, 3, 1, 9, 10]

[8, 5, 5, 5, 1, 1, 3, 8, 9, 10]

[5, 5, 5, 3, 1, 1, 8, 8, 9, 10]

[5, 3, 5, 1, 1, 5, 8, 8, 9, 10]

[5, 3, 1, 1, 5, 5, 8, 8, 9, 10]

[3, 1, 1, 5, 5, 5, 8, 8, 9, 10]

[1, 1, 3, 5, 5, 5, 8, 8, 9, 10]

[1, 1, 3, 5, 5, 5, 8, 8, 9, 10]

我不知道如何获得第 k 个最小的。我虽然关于最小堆,因为最小的总是索引 0,但它用于制作递减数组?

这是我的方法,它是一个堆排序。它调用 buildHeap,然后进行排序。

//Find kth smallest element-----------------------------------------------------------------------------------------
private int[] findKthSmallestElement(int[] arr, int kthElement) {
    buildheap(arr);
    System.out.println("Max Heap is made: " + Arrays.toString(arr));

    if(kthElement > arr.length){
        System.out.println("Number does not exist.");
        return arr;
    }
    else if(kthElement == arr.length){
        System.out.println(kthElement + " st/nd/th smallest element number" + " is: " + arr[0]);
        return arr;
    }

    heapSize = arr.length - 1;

    for(int i = heapSize; i > 0; i--) {

        swapCurrentNodeWithMaxChild(arr,0, i);

        heapSize--;

        percolateDown(arr, 0,heapSize);

        System.out.println(Arrays.toString(arr));
    }

    return arr;
}
安德烈·别列斯托夫斯基

我试图在最大堆中找到第 k 个最小的元素。据我了解,我需要按递增顺序对数组进行排序,并在获得第 k 个最小元素时返回。

不,要在最大堆中找到第 k 个小元素,我们只需n-k要从最大堆中提取元素。不需要排序。

这不会使 HeapSort O(N log N) 因为它需要另一个 for 循环来遍历数组。

我们不需要对数组进行排序,但作为旁注,遍历数组的循环不会改变任何东西,因为 O(N log N + N) == O(N log N)

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

返回第k个最小元素的函数

来自分类Dev

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

来自分类Dev

使用分区的数组中第K个最小元素

来自分类Dev

递归获得数组中第k个最小的元素

来自分类常见问题

在数组中查找K个最小元素(Java)

来自分类Dev

Java:使用2个数组查找数组的第K个最大元素

来自分类Dev

在给定的平衡二叉搜索树中查找最小(或最大)的k个元素

来自分类Dev

使用递归在Python列表中查找第K个最大元素

来自分类Dev

最小堆中大于或等于x的第K个最小元素

来自分类Dev

找出既不是第k个最大值也不是第k个最小值的元素的时间复杂度?

来自分类Dev

两个排序数组的并集中的第k个最小元素

来自分类Dev

两个排序数组的并集中的第k个最小元素

来自分类Dev

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

来自分类Dev

如何在Scala中获取优先级队列的第k个最小元素?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用foldr查找列表的第K个元素

来自分类Dev

Prolog在列表中查找第K个元素

来自分类Dev

在扩展字符串中查找第k个元素

来自分类Dev

查找单链列表的第k个元素

来自分类Dev

查找单链列表的第k个元素

来自分类Dev

在数组MIPS中查找第K个不同的元素

来自分类Dev

在Java中获取k个最小(或最大)数组元素的最快方法是什么?

来自分类Dev

查找列表中最小k个元素的更有效解决方案

来自分类Dev

第k个最小数字

来自分类Dev

获得第k个最大值

来自分类Dev

从大小为N的数组中选择K个元素,这样子数组中最小和最大元素之间的差最小

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

    返回第k个最小元素的函数

  4. 4

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

  5. 5

    使用分区的数组中第K个最小元素

  6. 6

    递归获得数组中第k个最小的元素

  7. 7

    在数组中查找K个最小元素(Java)

  8. 8

    Java:使用2个数组查找数组的第K个最大元素

  9. 9

    在给定的平衡二叉搜索树中查找最小(或最大)的k个元素

  10. 10

    使用递归在Python列表中查找第K个最大元素

  11. 11

    最小堆中大于或等于x的第K个最小元素

  12. 12

    找出既不是第k个最大值也不是第k个最小值的元素的时间复杂度?

  13. 13

    两个排序数组的并集中的第k个最小元素

  14. 14

    两个排序数组的并集中的第k个最小元素

  15. 15

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

  16. 16

    如何在Scala中获取优先级队列的第k个最小元素?

  17. 17

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

  18. 18

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

  19. 19

    使用foldr查找列表的第K个元素

  20. 20

    Prolog在列表中查找第K个元素

  21. 21

    在扩展字符串中查找第k个元素

  22. 22

    查找单链列表的第k个元素

  23. 23

    查找单链列表的第k个元素

  24. 24

    在数组MIPS中查找第K个不同的元素

  25. 25

    在Java中获取k个最小(或最大)数组元素的最快方法是什么?

  26. 26

    查找列表中最小k个元素的更有效解决方案

  27. 27

    第k个最小数字

  28. 28

    获得第k个最大值

  29. 29

    从大小为N的数组中选择K个元素,这样子数组中最小和最大元素之间的差最小

热门标签

归档