数据结构之堆

来源:互联网 发布:科比历年数据统计 编辑:程序博客网 时间:2024/05/22 02:09

数据结构刚刚开始学,全是没接触过的新内容,有点虚啊


堆之前先整理二叉树的几个概念:

数:从图论的观点来看,数等价于连通无环图

深度:沿每个节点v到根r的唯一通路所经过边的数目,称作v的深度,记作depth(v)

高度:数T中所有节点深度的最大值称作该树的高度(height),记作height(T)

度数:v的孩子总数

二叉树:每个节点的度数均不超过2

真二叉树:不含一度节点的二叉树

先序遍历:优先访问根节点x,然后依次深入左子树和右子树,递归地进行遍历

后序遍历:一次递归遍历左子树和右子树之后,才访问节点x

中序遍历:依次递归遍历左子树、访问节点x、递归遍历右子树

广度优先遍历(层次遍历):先上后下,先左后右——先访问树根,再依次是左孩子,右孩子、左孩子的左孩子、左孩子的右孩子、右孩子的左孩子、右孩子的右孩子...

完全二叉树:叶节点只能出现在最底部的两层

满二叉树:所有节点都处于最底层


二叉树的内容太多了,按照常规的逻辑顺序,应该是先学习树的内容,再进行堆,但是太多了,消化不完,这里还是决定先整理堆的内容。


堆的学习点主要就是大根堆和小根堆、建堆、堆排序、元素插入、元素删除

大根堆(大顶堆/最大堆),根节点最大,每个节点都不大于父节点;

小根堆(小顶堆/最小堆),根节点最小,每个节点都不小于父节点;

堆的高度h=[logn]=o(logn),insert()和delMax()操作的时间都线性正比于堆的高度h,可在o(logn)的时间内完成。

插入算法分为两个步骤:(1)新词条接至向量末尾(2)上滤调整

删除算法也分为两个步骤:(1)摘除堆顶(首词条),代之以末词条(2)下滤调整

创建堆:蛮力算法和Floyd算法,Floyd算法最优——只需自下而上、由深而浅地遍历所有内部节点,并对每个内部节点分别调用一次下滤算法。耗时取决于各节点的高度总和,若以满二叉树为例,则为o(n);而蛮力算法采用“自上而下的上率算法”,若有n个词条,意味着也要迭代n次,耗时o(nlogn)

堆排序(headsort):借助堆的相关算法,实现高效的排序。思路与选择算法基本相同:所有词条分成未排序和已排序两类,不断从前一类中取出最大者,顺序加至后一类。



0 0
原创粉丝点击