【数据结构】二叉树的顺序结构及实现(堆)

目录

1.二叉树的顺序结构

 2.堆的概念及结构

3.堆的实现

3.1堆向下调整算法

 3.2堆的创建

 3.3建堆的时间复杂度

3.4堆的插入

 3.5堆的删除

3.6堆的代码实现

3.7堆的应用

3.71堆排序

3.72 TOP-K问题


1.二叉树的顺序结构

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

 2.堆的概念及结构

堆的性质:

        堆中某个节点的值总是不大于或不小于其父节点的值;

        堆总是一棵完全二叉树

其中堆也可以分为大堆小堆。堆中根节点最大,向下递减的是大堆;根节点最小,向下递增的是小堆;

3.堆的实现

3.1堆向下调整算法

现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整 成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整。

int array[]={27,15,19,18,28,34,65,49,25,37};

 3.2堆的创建

下面我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算 法,把它构建成一个堆。根节点左右子树不是堆,我们怎么调整呢?这里我们从倒数的第一个非叶子节点的 子树开始调整,一直调整到根节点的树,就可以调整成堆。

int a[] = {1,5,3,8,7,6}; 

 3.3建堆的时间复杂度

因为堆是完全二叉树,而满二叉树也是完全二叉树,此处为了简化使用满二叉树来证明(时间复杂度本来看的 就是近似值,多几个节点不影响最终结果):

因此:向下调整建堆的时间复杂度为:O(N)。 

3.4堆的插入

先插入一个10到数组的尾上,再进行向上调整算法,直到满足堆。

 3.5堆的删除

删除堆是删除堆顶的数据,将堆顶的数据根最后一个数据一换,然后删除数组最后一个数据,再进行向下调 整算法。

3.6堆的代码实现

typedef int HPDataType;
typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;void HeapCreate(HP* hp, HPDataType* a);		//堆的构建
void HpDestroy(HP* hp);		//堆的销毁
void HpPush(HP* hp,HPDataType x);		//堆的插入
void HpPop(HP* hp);			//堆的删除
HPDataType HpTop(HP* hp);		//取堆顶的数据
int HeapSize(HP* hp);		//堆的数据个数
bool HpEmpty(HP* hp);		//堆的判空

3.7堆的应用

3.71堆排序

堆排序即利用堆的思想来进行排序,总共分为两个步骤:

1. 建堆 升序:建大堆 降序:建小堆

2. 利用堆删除思想来进行排序 建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。

3.72 TOP-K问题

TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。

比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。

对于Top-K问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能 数据都不能一下子全部加载到内存中)。最佳的方式就是用堆来解决,基本思路如下:

1. 用数据集合中前K个元素来建堆 前k个最大的元素,则建小堆 前k个最小的元素,则建大堆

2. 用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

vue父子组件通讯的几种方式总结学习

一直都是公司前端在写组件,我想着自己也写一波,然后先看看父子组件传值的内容,想写一写小demo然后练习一下这个内容,也算是系统学习一下怎么处理这个内容 其实就是2种父传子和子传父 1.父组件传子组件数据 其实就是父在标签中可…

学习Android的第八天

目录 Android ImageView 图像视图 ImageView 的基本使用 src属性和background属性的区别 范例 解决 anndroid:blackground 属性拉伸导致图片变形的方法 设置透明度的问题 范例 android:src 和 android:background 结合 范例 Java 代码中设置 blackground 和 src 属性…

分享66个表单按钮,总有一款适合您

分享66个表单按钮,总有一款适合您 66个表单按钮下载链接:https://pan.baidu.com/s/19lOG5sxI2Uy3KBIscffHRw?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不…

社区店经营策划书:从零到一,打造特色店铺

作为一名资深的鲜奶吧创业者,我深知开一家社区店并非易事,但凭借五年的经营经验和不断的学习,我成功地将我的鲜奶吧打造成为了一个特色店铺。 今天,我将与大家分享这份经营策划书,希望能为那些想开鲜奶吧或开其他店铺…

国产光耦2024:发展机遇与挑战全面解析

随着科技的不断进步,国产光耦在2024年正面临着前所未有的机遇与挑战。本文将深入分析国产光耦行业的发展现状,揭示其在技术创新、市场需求等方面的机遇和挑战。 国产光耦技术创新的机遇: 国产光耦作为光电器件的重要组成部分,其技…

TELNET 远程终端协议

远程终端协议 TELNET TELNET 是一个简单的远程终端协议,也是互联网的正式标准。 用户用 TELNET 就可在其所在地通过 TCP 连接注册(即登录)到远地的另一个主机上(使用主机名或 IP 地址)。 TELNET 能将用户的击键传到…

针对Sodinokibi黑客组织供应链攻击Kaseya VSA的分析溯源

前言 2021年7月2日,Sodinokibi(REvil)勒索病毒黑客组织疑似利用0day漏洞,通过Kaseya VSA发起大规模供应链攻击行动,此次事件影响范围广泛,目前瑞典最大链锁超市之一的Coop受此供应链勒索攻击事件影响被迫关闭全国约800多家商店服…

springboot169基于vue的工厂车间管理系统的设计

基于VUE的工厂车间管理系统设计与实现 摘 要 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱。本…

使用Pillow来生成简单的红包封面

Pillow库(Python Imaging Library的后继)是一个强大而灵活的图像处理库,适用于Python。Pillow 库(有时也称 PIL 库) 是 Python 图像处理的基础库,它是一个免费开源的第三方库,由一群 Python 社区…

卫星通讯领域FPGA关注技术:算法和图像方面(2)

最近关注的公众号提到了从事移动通信、卫星通讯等领域的FPGA、ASIC、信号处理算法等工程师可能需要关注的技术,有MVDR算法、高速基带芯片、RF芯片、毫米波有源相控阵天线、无线AI,以下做了一些基础的调研: 1 MVDR算法 声源定位是一个阵列信…

【动态规划】【字符串】1092. 最短公共超序列

作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 LeetCode1092最短公共超序列 给你两个字符串 str1 和 str2,返回同时以 str1 和 str2 作为 子序列 的最短字符串。如果答案不止一个,则可以返回满足条件的 任意…

redis-sentinel(哨兵模式)

目录 1、哨兵简介:Redis Sentinel 2、作用 3、工作模式 4、主观下线和客观下线 5、配置哨兵模式 希望能够帮助到大家!!! 1、哨兵简介:Redis Sentinel Sentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在re…

【MySQL】数据库基础 -- 详解

一、什么是数据库 存储数据用文件就可以了,为什么还要弄个数据库? 一般的文件确实提供了数据的存储功能,但是文件并没有提供非常好的数据(内容)的管理能力(用户角度)。 文件保存数据有以下几个缺点&…

证明之黄金分割比的无理性

黄金分割比的无理性 “黄金分割比的神奇之处:视觉化证明与数学的魅力” 人们在学习高等数学时,走到一个证明的结尾处,通常会经历这样的思考:“我理解每一行是怎样由前一行得到的,但是我却不明白为什么这个定理是正确…

DS:顺序栈的实现

创作不易,友友们给个三连吧!! 一、栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先…

[神奇代码岛】皮肤功能使用

前言 最近有很多人在制作地图的时候,因该会用到皮肤的功能,但是皮肤操作只知道UI操作,但缺点是,只能设置地图默认皮肤,根本都做不到想要的什么皮肤购买功能,自主穿戴功能,而API官方又放在非常隐…

python爬虫入门(一)

使用requests 库获取网站html信息 import requests response requests.get("https://jingyan.baidu.com/article/17bd8e52c76b2bc5ab2bb8a2.html#:~:text1.%E6%89%93%E5%BC%80%E6%B5%8F%E8%A7%88%E5%99%A8F12%202.%E6%89%BE%E5%88%B0headers%E9%87%8C%E9%9D%A2%E7%9A%84…

【C++】初识模板:函数模板和类模板

目录 一、模板函数 1、函数模板的概念 2、函数模板的格式 3、函数模板的原理 4、函数模板实例化 5、 模板参数的匹配原则 二、类模板 1 、类模板的定义格式 2 、类模板的实例化 3、模板类示例 一、模板函数 1、函数模板的概念 函数模板代表了一个函数家族&#xff0c…

2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题是由安全生产模拟考试一点通提供,安全员-B证证模拟考试题库是根据安全员-B证最新版教材,安全员-B证大纲整理而成(含2024年…

比较6*6范围内7个点182个结构的顺序

( A, B )---6*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有6个节点,训练集AB各由6张二值化的图片组成,让A中有7个点,让B全是0,收敛误差7e-4,收敛199次,统计迭代次数平均值并排序。 得到顺序为 用6个点的结构标…