文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java数据结构中的堆怎么应用

2023-06-29 19:12

关注

本篇内容介绍了“Java数据结构中的堆怎么应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、堆的创建

1、向下调整(以小堆为例)  

让parent标记需要调整的节点,child标记parent的左孩子(注意:parent如果有孩子一定先是有左孩子)

如果parent的左孩子存在,即:child < size, 进行以下操作,直到parent的左孩子不存在:

parent小于较小的孩子child,调整结束否则:交换parent与较小的孩子child,交换完成之后,parent中大的元素向下移动,可能导致子树不满足堆的性质,因此需要继续向下调整,即parent = child;child = parent*2+1; 然后继续2。

public void shiftDown(int[] elem,int parent,int len){        int cur=parent*2+1;        while(cur<len){           if(cur+1<len){               if(elem[cur+1]<elem[cur]){                   cur++;               }           }            if(this.elem[cur]<this.elem[parent]) {                swap(cur, parent);            }            parent=cur;            cur=parent*2+1;        }    }

2、创建堆

对于普通序列,我们需要从它的第一个有左节点的父节点开始调整,知道整棵树满足堆的性质。

Java数据结构中的堆怎么应用

3、创建堆的时间复杂度

堆必须是完全二叉树,满二叉树也是完全二叉树。由下面的计算,创建堆的时间复杂度为O(n).

Java数据结构中的堆怎么应用

 二、堆的插入和删除

1、堆的插入

Java数据结构中的堆怎么应用

 【向上调整】

public void shiftUp(int elem[],int child){        int parent=(child-1)/2;        while(parent>=0){            if(elem[child]>elem[parent]){                swap(child,parent);                child=parent;                parent=(child-1)/2;            }else{                break;            }        }    }

2、堆的删除

根据堆的性质,对删除的一定是堆顶元素。步骤如下:

Java数据结构中的堆怎么应用

 三、堆的应用

1、堆排序

升序:创建大根堆

降序:创建小根堆

交换堆顶元素和堆得最后一个元素,进行向下调整,直到堆有序。

Java数据结构中的堆怎么应用

2、top-k问题 【求最小的K个数】

top-k问题:求数据集合中前k个大或者小的元素,一般数据量都比较大。

Java数据结构中的堆怎么应用

class Solution {    public int[] smallestK(int[] arr, int k) {        int[] array=new int[k];        if(arr==null||arr.length<=k||k==0){            return array;        }        PriorityQueue<Integer> queue=new PriorityQueue<>((a,b)->b-a);        int i=0;        for(;i<k;++i){            queue.offer(arr[i]);        }        while(i<arr.length){            if(arr[i]<queue.peek()){                queue.poll();                queue.offer(arr[i]);            }            i++;        }        int size=queue.size();        for(int j=0;j<size;++j){            array[j]=queue.poll();        }        return array;    }}

四、常用接口的介绍

1、PriorityQueue的特性

Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列。PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,本文主要介绍PriorityQueue。

【PriorityQueue】使用的注意事项:

PriorityQueue的扩容方式:

int newCapacity = oldCapacity + ((oldCapacity < 64) ?

                      (oldCapacity + 2) : 

                   (oldCapacity >> 1));

PriorityQueue采用了:Comparble和Comparator两种方式。

Comparble是默认的内部比较方式,如果用户插入自定义类型对象时,该类对象必须要实现Comparble接口,并覆写compareTo方法

用户也可以选择使用比较器对象,如果用户插入自定义类型对象时,必须要提供一个比较器类,让该类实现Comparator接口并覆写compare方法

// 用户自己定义的比较器:直接实现Comparator接口,然后重写该接口中的compare方法即可class IntCmp implements Comparator<Integer>{   @Override   public int compare(Integer o1, Integer o2) {      return o2-o1;   }}PriorityQueue<Integer> p = new PriorityQueue<>(new IntCmp());

2、优先级队列的构造

构造器功能介绍
PriorityQueue()创建一个空的优先级队列,默认容量是11
PriorityQueue(int
initialCapacity)
创建一个初始容量为initialCapacity的优先级队列,注意:
initialCapacity不能小于1,否则会抛IllegalArgumentException异
PriorityQueue(Collection<?
extends E> c)
用一个集合来创建优先级队列

“Java数据结构中的堆怎么应用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯