• 二叉堆(优先队列)


    【0】README

    0.1) 本文总结于 数据结构与算法分析,但源代码均为原创;旨在理清二叉堆(优先队列) + 堆的其他操作及其应用, 以便让朋友些知道为什么要学习优先队列;


    ##**【1】二叉堆** **1.0)优先队列定义:**优先队列是允许至少下列两种操作的数据结构,**insert(插入)**, 它的工作时显而易见的,以及 **deleteMin(删除最小者)**, 它的工作是找出、返回和删除优先队列中最小的元素; **1.1)**我们把二叉堆中只叫做堆, **堆也有两个性质:**结构性和堆序性;对堆的 insert and deleteMin 操作必须要到堆的所有性质都被满足时才能终止; **1.2)结构性质**
    • 堆是一棵被完全填满的二叉树,其底层上的元素从左到右填入,这样的树称为 完全二叉树;完全二叉树 的高是 logN(向下取整), 显然它是 O(logN);
      这里写图片描述
    • 堆数据结构将由一个数组(不管关键字是什么类型)、一个代表最大值的整数及当前的堆大小组成;

    1.3) 堆序性质

    • 1)堆序性:使操作被快速执行的性质是 堆序性;由于我们想要快速找出最小元,因此最小元应该在根上;依据树的递归定义,则任意节点就应该小于它的后裔;

    【2】基本的堆操作

    2.1)insert 插入:为将一个元素X 插入到堆中, 在下一个空闲位置创建一个空穴, 否则该堆将不是完全树;如果X 可以放在该空穴中而并不破坏堆的序, 那么插入完成, 否则, 我们把空穴的父节点上的元素移入该空穴中;(这种一般策略叫做 上滤, 新元素在堆中上滤直到找出正确的位置);
    这里写图片描述
    2.2)deleteMin(删除最小元):找出最小元容易,困难是删除它;当删除一个最小元时, 在根节点处产生了一个空穴, 由于现在堆少了一个元素,因此对中最后一个元素 X 必须移动到堆的某个地方;如果X 可以被放到空穴中,那么 deleteMin 完成;显然这一般不可能, 因此我们将空穴中的较小者移入空穴, 这样就把空穴向下推了一层;重复该步骤直到 X 可以被放入空穴中;因此,我们的做法是将 X 置入沿着从根开始包含最小儿子的 一条路径上的一个正确的位置;(这种策略叫做下滤);
    这里写图片描述
    这里写图片描述
    2.3)出现的问题+解决方法

    • 出现的问题:在堆实现中, 经常发生的错误是当堆中存在偶数个元素的时候, 此时将遇到一个节点只有一个儿子的情况, 我们必须保证假设节点不总有两个儿子;
    • 解决方法:始终保证你的算法把每一个节点都看成有两个儿子;

    【3】源代码+printing

    3.1)download source code :
    https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter6
    3.2)代码详情+打印效果参见

    http://blog.csdn.net/PacosonSWJTU/article/details/49498255
    “【2】source code+printing”部分,因为二叉堆(优先队列)的基本操作 和 其他高级的应用操作的实现代码我都放到一起的;

  • 相关阅读:
    code#5 P2 棋子
    code#5 P1 报告
    ztz11的noip模拟赛T3:评分系统
    20181101noip模拟赛T1
    20181031noip模拟赛T2
    20181031noip模拟赛T1
    Linux进程的五个段
    进程和线程有什么区别
    shell中if条件字符串、数字比对,[[ ]]和[ ]区别
    Python实现单例模式
  • 原文地址:https://www.cnblogs.com/pacoson/p/4922033.html
Copyright © 2020-2023  润新知