前言:
以前学数据结构看堆,似懂非懂,没什么感觉
现在算法里的优先级队列的实现又用到了堆,这时突然感觉知其一了,
于是写了笔记,也许我有生之年能把所有的基本数据结构写一遍
首先我认为:
数据结构按抽象层次可以大体分为三类
1.低级数据结构:
1.数组
2.链表
2. 中级数据结构
1.树
2.堆
3 图
4.原始栈
5.原始队列
3.高级数据结构
1.高级语言中的对象型数据结构
2.其他
逻辑结构:
堆是一棵完全二叉树,不管是大顶堆还是小顶堆,实质上就是保证从根开始,每一棵子树的根都比它的孩子
的优先级大。具体来讲性质如下:
设
Maxk
表示优先级第k大的元素
1.
Max1
根节点
2.
Maxk
第二层到第k层中的某个节点
堆的插入(swim,上浮)
按照完全树节点的顺序插入新节点,然后只要优先级比根节点大,就不断与根节点交换
堆的删除(sink,下沉)
临时替代法
将root用最后一个节点覆盖,然后只要该节点比某一个直接孩子节点小,就与之交换
物理结构:
使用数组这样的顺序结构比较方便
按照完全树的编号,从1开始存储(为了计算直观,所以从1开始)
0号正好可以存储节点个数
已知一个节点编号i,则父节点i/2
左右孩子(2*i,2*i+1)(前提是节点存在)