二叉堆 & 优先级队列
优先级队列
实现方式:只需要查找极值元,不必维护所有元素之间的全序关系,偏序即可。
二叉堆/堆结构&性质
完全二叉树重要性质:
对于结点总数为N的完全二叉树,结点按层顺序编号(从第1层到最后一层,每层从左到右),对于任一结点k:
当k=1时,结点k为树的根,无父结点;当k>1时,其父结点为[k/2];
当2k=N时,结点k的左孩子结点为2k;
当2k>N时,结点k无左孩子;
当2k+1=N时,结点k的右孩子结点为2k+1;
当2k+1>N时,结点k无右孩子;
高度为h的完全二叉树结点数[2h,2h+1],完全二叉树的高是O(log N);
完全二叉堆 / 二叉堆 / 堆的结构性:
- 逻辑上,等同于完全二叉树;
- 物理上,由于完全二叉树结构上的紧凑性,直接借助数组表示一颗完全二叉树,继而实现优先队列;
- 数组序列 = 完全二叉树的层次遍历序列
- 结点k为根结点,优先级最高;
- 结点k为非根结点,父结点的优先级不小于其孩子结点的优先级;
完全二叉堆实现优先队列
完全二叉堆插入新元素:插入到底层,观察堆序性进行上滤
- 最大元:优先级最高的元素;
- Floyd算法&创建堆:
- 根据指定向量创建堆,逻辑对应完全二叉树;
- 对完全二叉树中内部结点进行下滤操作,逐层合并子二叉堆;
- 直到完全二叉树根结点下滤完成后,完成创建二叉堆;
- Floyd算法默认向量序列无序,时间复杂度O(n);
- 插入新元素(insert):物理上将e作为末元素接入向量,逻辑上等同于完全二叉树底层的空缺部分拓展新结点。
- 上滤(percolate up):将新元素与其新父亲反复按照堆序性要求向上调整位置,每经过一次上滤,新元素上升一层,最多上滤到根部;
- 由于完全二叉堆树高O(log n),上滤操作时间复杂度为O(log n);
- 下滤(percolate up):将新元素与其新孩子(较大者)反复按照堆序性要求向下调整位置,每经过一次下滤,新元素下降一层,直到满足堆序性;
- 由于完全二叉堆树高O(log n),下滤操作时间复杂度为O(log n);
所有博文来自个人为知笔记,内容多为读书笔记和理解内容;