算法笔记:堆

news/2024/11/16 21:38:54/

【如无特别说明,皆为最小二叉堆】

1 介绍

2 特性

  • 结构性:符合完全二叉树的结构
  • 有序性:满足父节点小于子节点(最小化堆)或父节点大于子节点(最大化堆)

3 二叉堆的存储

顺序存储

二叉堆的有序性可以很容易地通过下标来反映

4 堆中插入新元素

  • 堆的插入是在具有最大序号的元素之后插入新的元素或结点,否则将违反堆的结构性。
  • 如果新元素放入后,没有违反堆的有序性,那么操作结束。
  • 否则,让该节点向父节点移动,直到满足有序性或到达根节点。
  • 新节点的向上移动称为向上过滤

4.1 时间效率

  • 最坏情况是O(logn) 【一直交换到根节点】
  • 平均情况,过滤会提前结束。
    • 有资料表明,平均是2.6次比较,因此元素平均上移1.6层。

5 推出操作(DeQueue)

  • 当最小元素被删除时,在根上出现了一个空结点。堆的大小比以前小1,堆的结构性告诉我们,最后一个结点应该删掉。
  • 如果最后一项可以放在此空结点中,就把它放进去。然而,这通常是不可能的
  • 必须玩与插入操作类似的“游戏”:把某些项放入空结点,然后移动空结点。
    • 仅有的区别在于:对DeQueue操作,空结点是往下移动。

  • 找到空结点的一个较小的子结点,如果该儿子的值小于我们要放入的项,则把该儿子放入空结点,把空结点往下推一层
    • 重复这个动作,直到该项能被放入正确的位置。

5.1 时间复杂度

  • 最坏情况下,deQueue是一个对数时间的操作
  • 根据堆的有序性,堆中最后一个结点的值一般都是比较大的。因此,向下过滤很少有提前一或二层结束的,所以deQueue操作平均也是对数时间

6 建堆

  • 可以看成N次连续插入,其时间应该是在O(NlogN)时间内完成

  • 事实上,在构造过程中,我们并不关心每个元素加入后堆的状态,我们关心的是N个元素全部加入后的最后状态,最后的状态是要保证堆的有序性。至于中间过程中的有序性是否成立并不重要。
  • 有了这个前提后,我们能将构造堆的时间复杂度降到O(N)
    • 利用堆的递归定义
      • 如果函数buildHeap可以将一棵完全二叉树调整为一个堆 ,那么,只要对左子堆和右子堆递归调用buildHeap。
      • 至此,我们能保证除了根结点外,其余的地方都建立起了堆的有序性。
      • 然后对根结点调用向下过滤,以创建堆的有序性
      • 如果我们以逆向层次的次序对结点调用向下过滤,那么在向下过滤节点i时,所有结点i的子孙都已经调用过向下过滤。
        • 不需要对叶结点执行向下过滤
        • 从编号最大的非叶结点开始向下过滤

6.1 举例

一开始根据数据的先后建立一棵完全二叉树

从序号最大的非叶子节点(30)开始进行向下过滤

 

6.2 时间分析

  •  为h的节点(叶节点高度为0),在向下过滤中交换的最大次数是h
  • 建堆的最大时间是所有节点的调整时所需交换次数之和,即所有节点的高度之和

7 D堆

  • 每个节点有d个儿子,这样生成的堆比较矮。
  • 插入:O(\log_dN)
  • 删除:需要在d个元素中找出最小的,时间复杂度为:O(\log_dN)
  • 优点:插入快
  • 缺点:删除慢
  • 用途:
    • 插入比删除多的队列
    • 队列太大,内存放不下,要放在外存的时候

http://www.ppmy.cn/news/1094369.html

相关文章

达之云BI平台助力中国融通集团陕西军民服务社有限公司实现数字化运营

中国融通集团陕西军民服务社是一家大型综合类零售购物中心,公司目前管理系统运行了10年左右,面临系统新零售支持发展严重滞后,行业主流应用落地困难,如线上业务、到家业务、全渠道营销、电子发票、自助收银、扫码购、无感停车、未…

横版武侠手游推荐,有什么武侠游戏好玩的手游?

武侠游戏是游戏市场上不可或缺的游戏类型,许多武侠手游沿用了经典武侠小说中的各种设置,为玩家创造了一个身临其境的世界。有什么武侠游戏好玩的手游?今天小编就为大家带来了横版武侠手游推荐,这些游戏的游戏性和操作感是同类游戏…

跟着视频学习java,发现swagger打不开?怎么解决

前因 现在到处都在卷java,不会java的前端不是好前端。 这不,周围有前端同学开始学java了。 昨天他突然找我问说引入依赖,配置之后swagger打不开了。 分析过程 1、 查看他的swagger版本,让他试了对应路径/swagger-ui/index.h…

云备份客户端——客户端整体设计框架以及实用类工具实现

一,客户端整体框架 客户端要实现的功能和服务端相比相对简单,客户端要实现的功能是自动对指定文件中的文件进行备份,也就是定时对指定文件进行扫描,根据文件信息判断文件,符合要求(新文件或者被修改过的文件…

Compose的一些小Tips - 生命周期

系列文章 Compose的一些小Tips - 生命周期(本文) 前言 本系列介绍Compose的一些常识,了解这些tips并不会让人摇身一变成为大佬,但可以帮助到一些学习Compose的安卓开发者避免一些误区,也是对入门详解中遗漏的一个补充…

独立站不被收录的原因有哪些?

答案是:独立站不被收录是因为你的文章质量太差,建议使用GPC爬虫池促收录。 在进行Google优化的过程中,许多独立站长发现自己的网站没有被谷歌等搜索引擎收录。 这种情况可能会让站长们感到困惑和沮丧。 以下是一些常见的原因,以…

Golang综合项目实战(一)

Golang综合项目实战(一) 01-项目简介02-项目架构、术语、运行结果03-创建并初始化项目04-创建用户模型和错误处理05-创建密码加密工具类06-保存密码之前的hooks07-创建用户名密码验证工具类08-用户数据库操作逻辑09-操作用户service10-创建商品分类模型…

SpringBoot实现Excel导入导出

话不多说&#xff0c;直接上代码 依赖文档 找到pom文件&#xff0c;如下图所示 引入需要的依赖 <!-- hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.20</version>&…