可并优先队列

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二项堆。
这是一个比较高深的东西,同样也适用于 堆合并并且效率很高。 参考文献: 1.http://hi.baidu.com/%D0%D0%D7%DF%D4%DA%BF%D5%D6
%D0/blog/item/4f47587e3c8fd2280cd7da12.html 2. http://hi.baidu.com/%D0%D0%D7%DF%D4%DA%BF%D5%D6%D 0/blog/item/7523d112268f0a41f819b89f.html
可并优先队列 。
由此我们可以得出:左偏树是具有左偏性质的堆 有序二叉树。
左偏树满足以下两条性质: 1. dis(p)=dis(rightchild(p))+1;(因为左孩子的 dis值肯定大于等于右孩子的dis值) 2.一棵n个节点的左偏树的dis(root)至多为 【log2(n+1)】-1 (【】表示向下取整符号)
可并优先队列 。(操作2)
插入节点: 把此节点看作一棵左偏树,并入原树即可。 复杂度O(log n)。
back
可并优先队列 。(操作3)
取最小值:直接取树根即可。复杂度O(1)。
可并优先队列 。(操作4)
删除:删掉根节点后合并左右子树。复杂 度O(logn)。
可并优先队列 。(操作5)
构建一棵左偏树:有两种算法。 朴素算法:把所有节点依次插入一棵左偏 树。复杂度O(nlogn)。 队列算法:把所有节点放入一个队列,每 次取队首的两棵左偏树合并后放入队尾, 直到队列中只剩下一棵树为止。易证,这 样操作的复杂度为O(n)。(因为一开始 队 列里面每棵左偏树的节点个数都很少)
优先队列。(实现方法1)
容易想到,我们可以创建一个队列(线性 表),设里面的元素个数为n,则每次去这 n个元素中找一个最小的元素并删除,查找 时间复杂度为O(N); 至于插入元素,只需要插入到队尾即可, 时间复杂度O(1)。
优先队列。(实现方法2)
另外一种方法,就是建立一个有序线性表, 其中的元素按非递减顺序排列。查找并删 除最小的元素,即队首元素,时间复杂度 O(1); 插入元素,要二分查找放入位置,时间复 杂度是O(log n). 需要注意的是,要用数组模拟链表,因为 插入的时候会有些麻烦(比如在7和8之间插 入个7.5,7.5没地方放了)
可并优先队列 。
下面,我们将了解如何使用“左偏树(leftist ( tree) ”来快速实现最小堆合并的操作。 ) 1、左偏树的左右子树都是左偏树。 2、定义:一个节点是“外节点”,当且仅当该 节点的左子树或右子树为空。 3、一个节点的“距离”dis(p)表示节点p到其子 孙中最近外节点的距离(即 dis(p)= min(dis(leftchild[p]), dis(rightchild[p]))+1)。 如果一个节点本身就是外节点,则dis(p)=0。 4、左偏性质:对于一棵左偏树,有 dis(leftchild(root))>=dis(rightchild(root))。
可并优先队列 。
堆是一种很优秀的数据结构,编程简单, 堆是一种很优秀的数据结构,编程简单, 效率高,在很多场合都有其用武之地。 效率高,在很多场合都有其用武之地。但 是一旦涉及到合并, 是一旦涉及到合并,堆的弱点就体现出来 了——因为堆的设计初衷不是为了方便合 因为堆的设计初衷不是为了方便合 并而构造的,所以其合并效率非常低下, 并而构造的,所以其合并效率非常低下, 至少是O(n)级别的。如果碰到合并次数比 级别的。 至少是 级别的 较多的话,堆的优点就几乎全部被抵消了。 较多的话,堆的优点就几乎全部被抵消了。
如n=2时,dis(root)<=0, n=3~6时,dis(root)<=1, n=7~14时,dis(root)<=2,
可并优先队列 。
基本操作: 基本操作: 1)合并两棵左偏树 2)向现有左偏树插入一个节点 3)取最小值 4)删除根节点 源自文库)构建一棵左偏树
可并优先队列 。(操作1)
合并:设两棵左偏树分别为A、B,取A、B 的根权值的较小值作为新树的根(不妨设 为A),然后新树的左子树即为A树的左子 树;新树的右子树为 A的右子树与B树再次 合并出来的结果(其实质是个递归)
优先队列(实现方法3)
当然,使用我们学的堆是个不错的选择。 建立一个最小堆,每次取堆顶元素并删除 [O(1)],并将标号最大的元素移上来并维护 堆性质[O(log n)]; 插入元素并维护堆的性质也是O(log n)的。
可并优先队列。
说白了,优先队列其实就是一个堆-_如果你要将两个优先队列(两个最小堆) 合并,你会怎么做呢? 一种方法,就是将一个堆中的元素拆分成 一个一个的加入另一个堆。时间复杂度 O(log n).太慢。
优先队列
优先队列。
优先队列是0个或多个元素的集合,每个元 素都有一个优先权或值。 对优先队列执行的操作有1) 查找;2) 插入一 个新元素;3) 删除. 在最小优先队列中,查找操作用来搜索优 先权最小的元素,删除操作用来删除该元素; 对于最大优先队列,查找操作用来搜索优 先权最大的元素,删除操作用来删除该元素. 下面我们主要讨论最小优先队列。
相关文档
最新文档