zoukankan      html  css  js  c++  java
  • 二叉堆 & 优先级队列

    优先级队列

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

    二叉堆/堆结构&性质

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










  • 相关阅读:
    Redis学习
    extractor
    Linux fork exec等
    Linux kill 命令
    GCC参数使用
    Shell 参数(2) --解析命令行参数工具:getopts/getopt
    Shell 参数(1)
    shell 中并发执行
    Linux 下新增用户的流程
    Linux 安全rm
  • 原文地址:https://www.cnblogs.com/yzwall/p/6637180.html
Copyright © 2011-2022 走看看