rust(52)-二叉最大堆BinaryHeap
二叉堆(英语:binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆。
当父节点的键值总是大于或等于任何一个子节点的键值时为“最大堆”。当父节点的键值总是小于或等于任何一个子节点的键值时为“最小堆”。
None
Some(90)
[90, 87, 61, 69, 31, 9, 23, 11]------------------
(program exited with code: 0)请按任意键继续. . .
use std::collections::BinaryHeap;
fn main() {let mut my_heap=BinaryHeap::new();println!("{:?}",my_heap.peek());let x=[11,31,9,87,90,61,23,69];for i in &x{my_heap.push(i);}println!("{:?}",my_heap.peek());println!("{:?}",my_heap);
}
二叉堆一般用数组来表示。如果根节点在数组中的位置是1,第n个位置的子节点分别在2n和 2n+1。因此,第1个位置的子节点在2和3,第2个位置的子节点在4和5。以此类推。这种基于1的数组存储方式便于寻找父节点和子节点。
如果存储数组的下标基于0,那么下标为i的节点的子节点是2i + 1与2i + 2;其父节点的下标是⌊floor((i − 1) ∕ 2)⌋。函数floor(x)的功能是“向下取整”,或者说“向下舍入”,即取不大于x的最大整数(与“四舍五入”不同,向下取整是直接取按照数轴上最接近要求值的左边值,即不大于要求值的最大的那个值)。比如floor(1.1)、floor(1.9)都返回1。
如下图的两个堆:
1 11 / \ / \ 2 3 9 10/ \ / \ / \ / \ 4 5 6 7 5 6 7 8/ \ / \ / \ / \8 9 10 11 1 2 3 4
将这两个堆保存在以1开始的数组中:
位置: 1 2 3 4 5 6 7 8 9 10 11
左图: 1 2 3 4 5 6 7 8 9 10 11
右图: 11 9 10 5 6 7 8 1 2 3 4
对于一个很大的堆,这种存储是低效的。因为节点的子节点很可能在另外一个内存页中。B-heap是一种效率更高的存储方式,把每个子树放到同一内存页。
如果用指针链表存储堆,那么需要能访问叶节点的方法。可以对二叉树“穿线”(threading)方式,来依序遍历这些节点。
rust(52)-二叉最大堆BinaryHeap相关推荐
- 【数据结构】堆和二叉堆
1.什么是堆 堆是一棵具有特定性质的二叉树,堆的基本要求是堆中所有结点的值必须大于等于(或小于等于)其孩子结点的值,这也称为堆的性质.堆还有另一个性质,就是当h>0时,所有叶子结点都处于第h或h ...
- python最大堆_二叉堆 及 大根堆的python实现
Python 二叉堆(binary heap) 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子 ...
- 数据结构与算法--二叉堆(最大堆,最小堆)实现及原理
二叉堆(最大堆,最小堆)实现及原理 二叉堆与二叉查找树一样,堆也有两个性质,即结构性质和堆性质.和AVL树一样,对堆的一次操作必须到堆的所有性质都被满足才能终止,也就是我们每次对堆的操作都必须对堆中的 ...
- 二叉堆的实现(最大堆)
二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆. 最大堆:父结点的键值总是大于或等于任何一个子节点的键值:最小堆:父结点的键值总是小于或等于任何一 ...
- 完全二叉树——二叉堆(BinaryHeap)
前言 优先队列是允许至少下列两种操作的数据结构:insert(插入)以及deleteMin(删除最小者),其中deleteMin的工作是找出.返回.并删除优先队列中最小的元素.insert操作等价于e ...
- C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划
C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...
- java 二叉堆_二叉堆(三)之 Java的实现
概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两 ...
- 数据结构之优先队列--二叉堆(Java实现)
前言 数据结构队列的学习中,我们知道队列是先进先出的.任务被提交到队列中,按照先进先出的原则 对各个任务进行处理.不过在现实的情况下,任务通常有着优先级的概念,例如短任务.管理员的操作 应该优先执行. ...
- 二叉堆与二叉堆的构建
什么是二叉堆? 二叉堆本质上是一种完全二叉树,它分为两个类型: 最大堆:任何一个父节点的值,都大于或等于它左.右孩子节点的值. 最小堆:任何一个父节点的值,都小于或等于它左.右孩子节点的值. 二叉堆的 ...
最新文章
- ks检验正态分布结果_【学习】AD, RJ和KS哪种正态性检验是最好的?
- libpcap原理阐述
- 两列高度自适应(转)
- 轴固定位置_3轴、3+2轴、5轴加工都有哪些区别?这篇文章给你整明白
- oracle定时任务的编写及查看删除
- java上传与下载文件_java实现文件的上传和下载功能
- 魅族MX4的线控电路图
- Xcode中的-ObjC和-all_load
- Win11系统怎样设置更改密码
- 【java SOAP】对SOAP的一个个人印象
- 关于C#函数对象参数传递的问题
- 12. JavaScript Number 对象
- JS 通过选择百度地图地址获取经纬度自动填充到文本框中的方法
- 面试 之 git工作流
- 【九天教您南方cass 9.1】 10 DTM土方计算的四种方法
- 计算机字体颜色太浅,我的打印机打字太淡,如何调,打印的字就能够颜色
- HTML颜色代码大全
- STM32L476+STM32cubeMx+Freemodbus移植记录
- 计算机中信息的表示方法 教案,计算机中的数的表示教案
- 对于开发软件的NABCD分析