二叉堆 & 优先级队列

优先级队列

实现方式:只需要查找极值元,不必维护所有元素之间的全序关系,偏序即可。

二叉堆/堆结构&性质

完全二叉树重要性质:
    对于结点总数为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);










原文地址:https://www.cnblogs.com/yzwall/p/6637180.html