码迷,mamicode.com
首页 > 编程语言 > 详细

二叉堆的应用——查找长度为N数组中第M大数

时间:2019-11-09 23:48:52      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:inf   图片   class   span   长度   ref   font   https   解决   

看到这个题目首先想到是排序,那么时间复杂度自然就是O(NlgN)。那么使用二叉堆如何解决呢?

对于下面一个数组,共有12个元素,我们的目标就是找出第5大元素——12

技术图片

 

 

 首先建立一个具有M个元素的最小堆,那么堆顶是这M个元素的最小值,接下来遍历剩下的元素,如果一个元素小于堆顶元素则不做任何操作,如果大于堆顶元素,则替换该元素,并且调整最小堆。显然最后堆的M个元素是最大的M个元素,而它们中最小的正式堆顶元素。

实现代码

        Heap <Integer> h = new Heap<>();
        Integer [] i = {7,5,15,3,17,2,20,24,1,9,12,8};
        int  M = 5;
        for (int j = 0; j < M; j++)
            h.insert(i[j]);

        for (int j = M; j< i.length;j++)
        {
            if(i[j] > h.getFirst())
            {
             h.deleteFirst();
             h.insert(i[j]);
            }
        }

        System.out.println(h.getFirst());

Public void deleteFirst()和public Y getFirst()方法分别获取堆顶数据和删除堆顶数据。

    public void deleteFirst()
    {
        delete(getFirst());
    }

    public Y getFirst()
    {
        return data.get(0);
    }

其余代码可在博文二叉堆的介绍和Java实现查看。

建立堆时间复杂度为O(M),遍历剩余数组的时间复杂度是O(N-M),每次调整堆的时间复杂度是O(logM)。其中2和3是嵌套关系,1和2,3是并列关系,所以总的最坏时间复杂度是O((N-M)logM+M) 。当M远小于N的情况下,也可以近似地认为是O(NlogM)。值得一提的是,这并不是求解该题时间复杂度最优的方法,一种基于快速排序的方法可以将时间复杂度减低到线性,这个等我们讲到快排时有机会再来看。

 

 

二叉堆的应用——查找长度为N数组中第M大数

标签:inf   图片   class   span   长度   ref   font   https   解决   

原文地址:https://www.cnblogs.com/lbrs/p/11828154.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!