什么是大顶堆?举个例子

一、什么是大顶堆?

大顶堆(Max Heap)是一种二叉堆的实现,它满足以下性质:

  1. 任意节点的值都大于等于其子节点的值。
  2. 根节点(堆顶)的值是整个堆中最大的。

大顶堆通常用于实现优先队列等数据结构,其中需要快速访问和删除最大元素。它的实现通常是通过数组来完成的,其中父节点和子节点的关系可以用数组的索引来表示。

在大顶堆中,如果一个节点的索引是i,那么它的左子节点的索引是2i+1,右子节点的索引是2i+2。

大顶堆的一些基本操作包括:

  1. 插入元素:将新元素插入到堆的末尾,然后通过一系列交换操作将其上移,以维持堆的性质。
  2. 删除堆顶元素:将堆顶元素与末尾元素交换,然后移除末尾元素并通过一系列交换操作将新的堆顶元素下移,以维持堆的性质。
  3. 构建堆:将一个无序数组转换成一个大顶堆,通常采用从后往前遍历数组进行堆化操作。
  4. 堆排序:利用大顶堆进行排序,首先构建大顶堆,然后反复将堆顶元素与末尾元素交换并维护堆的性质,直到整个数组有序。

大顶堆的时间复杂度如下:

  • 插入元素:O(log n)
  • 删除堆顶元素:O(log n)
  • 构建堆:O(n)
  • 堆排序:O(n log n)

二、举一个大顶堆的例子

假设我们有一个包含以下整数的数组:[10, 20, 15, 30, 40, 5]

我们将通过构建一个大顶堆来演示。首先,我们从数组的末尾开始构建堆。

  1. 为了有效地构建大顶堆,我们需要从最后一个非叶子节点开始向前进行堆化操作。最后一个非叶子节点的索引可以通过数组长度的一半减去1来计算,因为最后一个非叶子节点的索引是最后一个节点的父节点。本例子中最后一个非叶子节点是15。                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

2.调整15之前的节点

  • 对于节点20:20 > 30 和 40,不需要调整。

  • 对于节点10:10 < 20 和 15,交换10和20的位置,得到:

 

3. 继续堆化节点10。10 < 30 和 40,交换10和30的位置 

4.继续堆化节点20。20 > 10 和 15,不需要调整。

5. 继续堆化节点15。15 < 5,交换15和5的位置。

三、如何用Python实现大顶堆

class MaxHeap:def __init__(self):self.heap = []def insert(self, val):self.heap.append(val)self._percolate_up(len(self.heap) - 1)def extract_max(self):if not self.heap:return Noneif len(self.heap) == 1:return self.heap.pop()max_val = self.heap[0]self.heap[0] = self.heap.pop()self._percolate_down(0)return max_valdef _percolate_up(self, idx):parent_idx = (idx - 1) // 2while idx > 0 and self.heap[idx] > self.heap[parent_idx]:self.heap[idx], self.heap[parent_idx] = self.heap[parent_idx], self.heap[idx]idx = parent_idxparent_idx = (idx - 1) // 2def _percolate_down(self, idx):left_child_idx = 2 * idx + 1right_child_idx = 2 * idx + 2max_idx = idxif left_child_idx < len(self.heap) and self.heap[left_child_idx] > self.heap[max_idx]:max_idx = left_child_idxif right_child_idx < len(self.heap) and self.heap[right_child_idx] > self.heap[max_idx]:max_idx = right_child_idxif max_idx != idx:self.heap[idx], self.heap[max_idx] = self.heap[max_idx], self.heap[idx]self._percolate_down(max_idx)# 示例用法
max_heap = MaxHeap()
max_heap.insert(10)
max_heap.insert(20)
max_heap.insert(15)
max_heap.insert(30)
max_heap.insert(40)
max_heap.insert(5)print(max_heap.heap)  # 输出: [40, 30, 15, 10, 20, 5]print(max_heap.extract_max())  # 输出: 40
print(max_heap.heap)  # 输出: [30, 20, 15, 10, 5]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/743962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嘿!终于等到了!应用开发云资源套餐如约而至!

MemFire Cloud平台更新啦&#xff01;&#xff01;此次更新我们推出了万众期待的计费套餐&#xff0c;下面给大家带来详细的介绍~ 计费模式为“基础套餐按量付费”&#xff0c;您可选择购买带有一定配额的基础套餐&#xff0c;超出配额部分可以通过开启“超限按量”功能来转为…

AbilityStorage理解与反思

1.简介&#xff1a; AbilityStage是一个Module级别的组件容器&#xff0c;应用的HAP在首次加载时会创建一个AbilityStage实例&#xff0c;可以对该Module进行初始化等操作。 2.那么Module分为三类&#xff1a;Hap,Har,Hsp 官网上的表述容易误解&#xff1a;实际上AbilitySta…

表单修饰符和事件修饰符

表单修饰符和事件修饰符 表单修饰符 v-model.lazy v-model.lazy 失去焦点后再收集数据 <div id"app"><textarea name"" id"" cols"30" rows"10" v-model.lazy"a"></textarea>{{a}}<textar…

【深度学习】深度估计,Depth Anything Unleashing the Power of Large-Scale Unlabeled Data

论文标题&#xff1a;Depth Anything Unleashing the Power of Large-Scale Unlabeled Data 论文地址&#xff1a;https://arxiv.org/pdf/2401.10891.pdf 项目主页&#xff1a;https://depth-anything.github.io/ 演示地址&#xff1a;https://huggingface.co/spaces/LiheYoung…

PyCharm 中 Python 解释器的配置

温馨提示&#xff1a;本文 PyCharm 版本是 2022.3.3 前言 作为 Python 新手&#xff0c;在了解了基本语法之后&#xff0c;肯定得先用 IDE 工具写个 Hello World&#xff0c;来了解 Python 编程语法及 IDE 工具的常规配置和使用&#xff0c;这里我用的 IDE 工具是 PyCharm。 …

unicloud update 修改

update 修改 使用腾讯云时更新方法必须搭配doc、where方法使用&#xff0c;db.collection(‘test’).update()会报如下错误&#xff1a;param should have required property ‘query’ collection.doc().update(Object data)未使用set、remove更新操作符的情况下&#xff0c…

如何通过libusb直接向zebra打印机发送zpl,跨平台win/linux

环境&#xff1a;windows & linux & Zebra打印机gt820 windows: 之前安装了Zebra打印机官方驱动&#xff0c;所以先卸载掉驱动。再安装Zadig&#xff0c;用Zadig工具来安装WinUSB驱动。 zadig下载&#xff1a;Zadig - USB driver installation made easy 记住这两个数…

c语言指针基础下(下)

指针 字符指针变量 字符串变量的一般使用 int main() {char ch w;char* p &ch;*p h;printf("%c", ch);return 0; }上面就是通过指针的解引用改变了ch的值 int main() {char* p "ni hao a";//这个是常量字符串printf("%s\n", p);//打印…

超融合如何助力水务公司实现虚拟化与容器环境统一管理?

近些年&#xff0c;企业 IT 基础架构现代化转型的步伐逐渐加快&#xff0c;不少金融、医疗、政府等行业的用户&#xff0c;已在生产环境部署 Kubernetes 等云原生基础设施&#xff0c;为业务应用提供敏捷支持。不过&#xff0c;一些企业的容器化转型仍处于起步阶段&#xff0c;…

学习Android的第二十八天

目录 Android Service (服务) 线程 Service (服务) Service 相关方法 Android 非绑定 Service startService() 启动 Service 验证 startService() 启动 Service 的调用顺序 Android 绑定 Service bindService() 启动 Service 验证 BindService 启动 Service 的顺序 …

Instant --java学习笔记

Instant 时间线上的某个时刻 / 时间戳过获取lnstant的对象可以拿到此刻的时间&#xff0c;该时间由两部分组成:从1970-01-01 00:00:00 开始走到此刻的总秒数不够1秒的纳秒数 Instant的常见方法&#xff1a; Instant可以用来记录代码的执行时间&#xff0c;或用于记录用户操作某…

面试经验分享 | 通关某公司面试靶场

0x00:探测IP 首先打开时候长这个样&#xff0c;一开始感觉是迷惑行为&#xff0c;试了试/admin&#xff0c;/login这些发现都没有 随后F12查看网络&#xff0c;看到几个js文件带有传参&#xff0c;就丢sqlmap跑了一下无果 随后也反查了域名一下&#xff0c;发现没有域名&#…

[java入门到精通] 20 反射精讲

复习 1.索引&#xff1a;主要是提高查询性能。 2.索引分类&#xff1a;主键索引 唯一索引 普通索引 组合索引 全文索引 hash索引 3.索引底层数据结构是btree.非叶子结点是由&#xff1a;索引指针域 叶子结点&#xff1a;索引数据(数据地址)&#xff0c;是双链表 4.jdbc:java…

《高效便捷,探索快递柜系统架构的智慧之路》

随着电商业务的蓬勃发展&#xff0c;快递柜系统作为一种高效、便捷的最后一公里配送解决方案&#xff0c;正在受到越来越多企业和消费者的青睐。本篇博客将深入探讨快递柜系统的架构设计理念、优势和实践&#xff0c;帮助读者了解如何构建智能化的快递柜系统&#xff0c;提升物…

简单的网页才好学习嘛!!!

做一个个人博客第一步该怎么做&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;…

idea中操作Git将本地仓库代码完整提交到Gittee中

文章目录 1.在idea中打开你的项目根目录&#xff0c; idea中vcs -> create Git Repository2.选中你的项目所在的目录3. git commit -m"你的备注"4. 直接强制本地仓库覆盖远程仓库的东西5.或者直接使用git 进行这个操作 1.在idea中打开你的项目根目录&#xff0c; …

【Python/crawl】如何使用Python爬虫将一系列网页上的同类图片下载到本地

【需求】 从网页https://www.zhainq.com/%e7%be%8e%e5%a5%b3%e5%86%99%e7%9c%9f%e6%9c%ba%e6%9e%84/%e6%97%a5%e6%9c%ac%e7%be%8e%e5%a5%b3%e5%86%99%e7%9c%9f/109012.html 开始&#xff0c;有十七页&#xff0c;每页都有大漂亮“小濑田麻由”的若干图片&#xff0c;想要将其…

Gitee的注册和代码提交(附有下载链接)

目录 一、Git的下载和安装二、安装图形化界面工具三、在Gitee上创建仓库四、如何把仓库开源五、Clone远程仓库到本地六、拷贝代码到本地的仓库七、Add-Commit-Push到远程仓库八、可能出现的问题8.1 建议在本地仓库直接创建项目8.2 第一次Push可能出现的问题8.3 怎么删除Gitee上…

Element-Plus: Select组件实现滚动分页加载

Element-Plus的select组件并没有自带滚动分页加载的功能&#xff0c;其虽然提供了自定义下拉菜单的底部的方式可以自定义上一页及下一页操作按钮的方式进行分页加载切换&#xff1a; 但如果不想通过点击分页按钮的方式&#xff0c;利用滚动触底进行下一页加载的话&#xff0c;…

2024年太原等保测评中心名单看这里!

开年来&#xff0c;不少太原小伙伴打算做等保了。大家都在问&#xff0c;目前太原等保测评中心有哪些&#xff1f;在哪里丫&#xff1f;这不我们小编就给大家整理一下&#xff0c;仅供参考哈&#xff01; 2024年太原等保测评中心名单看这里&#xff01; 序号&#xff1a;1 …