Java——堆笔记+topk问题+堆排序
创始人
2025-05-29 10:13:22
0

目录

堆的概念

下标关系

初始条件

向下调整函数shiftDown

createHeap函数

PriorityQueue的中常用方法模拟实现

offer();

isFull()

shifUp()向上调整

offer()

poll();

isEmpty()

poll()

peek();

堆排序

topk问题

 

 


堆的概念

  1.  堆逻辑上是一棵完全二叉树;
  2.  堆物理上是保存在数组中;
  3.  满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆;
  4.  反之,则是小堆,或者小根堆,或者最小堆;
  5. 堆的作用是快速找集合中的最值。

下标关系

已知双亲(parent)的下标,则: 左孩子(left)下标 = 2 * parent + 1; 右孩子(right)下标 = 2 * parent + 2; 已知孩子(不区分左右)(child)下标,则: 双亲(parent)下标 = (child - 1) / 2;

初始条件

    public int[] elem;public int usedSize;public TestHeap(){this.elem=new int[10];}

向下调整函数shiftDown

以转换为大堆为例

/***向下调整函数的实现* parent:每个树的根节点* len:每棵树的调整结束位置 10* **/

向下调整就是每次交换完之后会沿着当前这个路径向下检测

1.从最后一个子树出发

2.每颗子树都是向下调整的

如何调整为大根堆 

 问题:

1.如何找到最后一颗子树?

父亲节点:(child-1)/2;

此时节点:((len-1)-1)/2

2.parent--就可以遍历完每一棵子树了

3.最主要的问题就是写一个函数进行向下调整

4.每棵树的调整结束位置,如何判定?

每棵树调整的结束位置实际都是一样的len。

    //此时的时间复杂度:每层的节点个数*每层向下检测的层数O(n)public void shiftDown(int parent,int len){int child=2*parent+1;//最起码是有左孩子的,至少有一个孩子while(childelem[parent]){int temp=elem[child];elem[child]=elem[parent];elem[parent]=temp;//交换完之后需要继续向下检测parent=child;child=2*parent+1;}else if(elem[child]

createHeap函数

    public void createHeap(int [] array){for (int i = 0; i < array.length; i++) {elem[i]=array[i];usedSize++;}for (int parent = (usedSize-1-1)/2; parent >= 0; parent--) {shiftDown(parent,usedSize);}}

PriorityQueue的中常用方法模拟实现

offer();

isFull()

    public boolean isFull(){return usedSize==elem.length;}

shifUp()向上调整

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

offer()

    //向上调整public void offer(int val){if(isFull()){//扩容elem= Arrays.copyOf(elem,2*elem.length);}elem[usedSize++]=val;//注意:shifUp(usedSize-1);}

poll();

/***** 关于出队列:每次保证出的是最大或者最小的元素* 交换0下标和最后一个下标的元素* 调整0下标这棵树* **/

isEmpty()

   public boolean isEmpty(){return usedSize==0;}

poll()

    public int poll(){if(isEmpty()){throw new RuntimeException("优先级队列为空");}int tmp=elem[0];elem[0]=elem[usedSize-1];elem[usedSize-1]=tmp;usedSize--;shiftDown(0,usedSize);return tmp;}

peek();

 /*** 返回队首元素* **/public int peek(){if(isEmpty()){throw new RuntimeException("优先队列为空");}return elem[0];}

堆排序

 /*** 堆排序* 从小到大排序* **//**** 从小到大排序:* 1.调整为大根堆* 2.0下标与最后一个未排序的元素进行交换* 3.end--* */public void heapSort(){int end=usedSize-1;while(end>0){int temp=elem[0];elem[0]=elem[end];elem[end]=temp;shiftDown(0,end);end--;}}

topk问题

/*** 求数组中前k个最大元素 间一个小堆,大小是k,堆顶元素就是第k大的元素;* 求数组中前k个最小的元素 建立一个大堆,大小是k,堆顶元素就是第k小的;* */
    //这里求前k个最小的元素:public static int[] topK(int[] array,int k){//创建一个大小为K的大根堆//java中对象的比较PriorityQueue maxHeap=new PriorityQueue<>(k, new Comparator() {@Overridepublic int compare(Integer o1, Integer o2) {return o2-o1;}});//2.遍历数组当中的元素,前k个元素放在队列当中,for (int i = 0; i < array.length; i++) {if(maxHeap.size()array[i]){//先弹出maxHeap.poll();//后存入maxHeap.offer(array[i]);}}}int[] tmp=new int[k];for (int i = 0; i < k; i++) {tmp[i]=maxHeap.poll();}return tmp;}

 

 

相关内容

热门资讯

内联函数和模版函数的常见错误、... 内联函数和模版函数的常见错误、以及其为什么可以将其声明和定义在头文件实现并被多个源文件引用1 编译器...
妈妈,我想回家诗歌 妈妈,我想回家诗歌  字/红莲清韵  妈妈,我想回家  昨天,我又在梦中见到了您  您那慈爱的笑容 ...
春江花月夜的情感基调 春江花月夜的情感基调  张若虚的《春江花月夜》是一首七言歌行体诗歌。歌行体诗歌最重要的特点有三个,第...
自由歌诗歌 自由歌诗歌三则  生命诚可贵,爱情价更高。若为自由故,二者皆可抛。  ——题记  一、风筝  飞得再...
感恩父母诗歌 感恩父母诗歌(通用8首)  在平平淡淡的日常中,大家都对那些朗朗上口的诗歌很是熟悉吧,诗歌饱含着作者...
实战打靶集锦-011-bbs-... 提示:本文记录了博主一次失败的打靶经历。 目录1. 主机发现2. 端口扫描3. 服务...
【SSM】MyBatis(三.... 文章目录1.environment2.transactionManager3. dataSource...
循环结构语句 系列文章目录 前端系列文章——传送门 JavaScript系列文章——传送门 文章目录系列文章目录...
赞美雷锋的诗歌赏析 赞美雷锋的诗歌赏析  你,浪花里的一滴水  魏钢焰  在这里,  我要唱一个人。  他不是将军,  ...
今生与你共度的诗歌 今生与你共度的诗歌  今生与你共度  发自由衷的肺腑  新年的钟声  拉开了我们相爱的序幕  不同的...
送给老师的诗歌 送给老师的诗歌(精选6篇)  在现实生活或工作学习中,大家或多或少都接触过一些经典的诗歌吧,诗歌是一...
生命的长度诗歌 生命的长度诗歌  每个人的生命都有长度,  而生命的意义  也许并不于生命存在的长度,  生命也有宽...
CV——day85 注意力机制... Attention Is All You Need1 Introduction2 Backgroun...
堆优化dijkstra基础、模... 例题及代码模板 模拟堆 一、题目描述 维护一个集合,初始时集合为空,支...
代码随想录算法训练营第四十七天... 198 打家劫舍 看完题后的思路 看完题后的思路 dp【i】:0-i的房间ÿ...
2022描写七夕节的诗歌 对于七夕节,又叫做乞巧节、七巧节或七姐诞,是一个非常浪漫的节日,又一年的七夕节悄悄到来,知道描写七夕...
当我想起你诗歌 当我想起你诗歌  当我想起你,  微笑醒来在清亮的晨光里,  你城市的上空,  是否也倾倒着一城的阳...
致老师的诗歌(模板)5篇 在学习、工作或生活中,大家都看到过许多经典的诗歌吧,诗歌具有精炼、集中,节奏鲜明,富有韵律的特点。还...
歌颂党的诗歌朗诵3分钟 歌颂党的诗歌朗诵3分钟  在日常的学习、工作、生活中,大家一定没少看到经典的诗歌吧,诗歌是用高度凝练...
js学习13(Math) 目录 Math方法结构图 Math详介 相关函数图 Math方法结构图 Math详介 ### 8...