数据结构——堆

堆是一种特殊的数据结构,也被称为优先级队列。在出队列时,优先级高的元素先出,同优先级则遵循FIFO原则。堆实质上是一棵完全二叉树,分为大堆和小堆。本文介绍了堆的存储方式、操作(向下调整、构建堆、向上调整)、优先级队列的实现以及如何利用堆解决TopK问题。
摘要由CSDN通过智能技术生成
  1. 概念:
    堆也叫做优先级队列,入队列的时候同样是和普通队列一样入,但是出队列的时候优先出优先级较高的元素,优先级相同的情况下再按照先进先出的方式进行。堆的实质实际是一棵二叉树,并且这颗二叉树需要满足以下三个条件:
    ①:
    满足完全二叉树的条件,也就是当某个节点没有子节点或者没有右节点之后,它后面的所有节点都不能再有子节点。
    ②:
    对于整棵树中的任意某颗子树,都要满足根节点的值小于或者大于左右子节点的值,称为小堆和大堆。并且满足小堆就不可能满足大堆,反之亦然。
    堆通常通过数组来进行存储,通过层序遍历一棵满足以上条件的完全二叉树,将遍历结果存储到数组中,就得到了一个优先级队列。

  2. 堆的操作:
    ①向下调整:当堆顶元素也就是队首元素发生改变之后,整个堆的规则就被打乱了,需要重新进行调整。
    前提:左右子树满足堆的规则。
    以小堆为例

public static void func(int size,int[] arr,int K){
        int parent = K;
        int child = parent*2+1;//通过父节点的下标计算出子节点的下标
        while(child<size){//child<size代表当前子节点是存在的。不能取等于是因为size是个数,从1开始计算,child是下标,从0开始
            if(child+1<size&&child+1<child){//child+1代表child这个节点的兄弟节点,小于size代表它也是存在的
          
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值