左偏树.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
左偏树 什么叫左偏树 顾名思义,它是一棵向左偏的树。实际上,它是一棵可合并的不平衡二叉树。 它满足堆的性质,它除了支持堆基本的插入、查询、删除操作外,还支持在对数级的时间内完成一种特殊的操作——合并。 左偏树的每个节点除了和二叉堆一样拥有左右儿子(l、r)、键值(key)这三个属性外,还具有一个另外的属性——距离(dis)。 在键值这个属性上,左偏树满足堆性质。 在距离这个属性上,左偏树满足左偏性质。 左偏性质 左偏树的性质 左偏树的操作 左偏树合并的伪代码 用记录实现合并 type arr=record dis,key,l,r:longint; end; var a:array[1..20000] of arr; function merge(x,y:longint):longint; var t:arr; b:longint; begin if x=-1 then exit(y); if y=-1 then exit(x); if a[x].keya[y].key then begin t:=a[x];a[x]:=a[y];a[y]:=t;end; a[x].r:=merge(a[x].r,y); if a[x].l=-1 then begin b:=a[x].r;a[x].r:=a[x].l;a[x].l:=b;end else if a[a[x].r].disa[a[x].l].dis then begin b:=a[x].r;a[x].r:=a[x].l;a[x].l:=b;end; if a[x].r=-1 then a[x].dis:=0 else a[x].dis:=a[a[x].r].dis+1; exit(x); end; 左偏树的建立 左偏树的插入 查询、删除最小节点 练习 * 2012届 雷士驰 我们定义节点i为外节点,当且仅当i的左子树或右子树为空。 一个节点的距离为他到他后代中,最近的外节点所经过的边数。特别的,如果一个节点本身为外节点,则这个节点的距离为0。一棵子树的距离为这棵子树根节点的距离。为了方便,空节点的距离为-1。 左偏树的左偏性质即左偏树的每个节点左子节点的距离都不小于右子节点的距离。 即:dis(i,l)=dis(i.r) 上面已经介绍了左偏树的两个性质,堆性质和左偏性质。这里介绍另外几个性质。 一、左偏树的每个节点的左右子树都是一棵左偏树。二、节点的距离为他右子节点的距离加1。 三、如果一棵左偏树的距离一定,则节点最少的左偏树是完全二叉树。 四、一棵距离为k左偏树,至少有2k+1-1个节点。 五、一棵N个节点的左偏树,距离最大log(N+1)-1 左偏树支持以下操作: 一、插入一个节点。 二、查询、删除最小节点。 三、合并两棵左偏树 (Merge)。 四、建立左偏树。 因为合并操作是左偏树特有的,我们首先来了解。 Function Merge(A,B) Begin If A=Null Then Return(B) If B=Null Then Return(A) If key(A)key(B) then Swap(A,B) A.Right ← Merge(A.Right,B) If A.Right.disA.Left.dis Then Swap(A.Right,A.Left) If A.Right=Null Then A.dis ← 0 Else A.dis ← A.Right.dis+1 Return(A) End 我们将N个节点构成一棵左偏树。 算法一:利用插入操作,一个个插入。O(NlogN) 算法二:用一个队列不断取出两棵队首的左偏树,合并这两棵左偏树,然后放入队尾。O(N) 因为单节点的树一定是一个左偏树,所以节点的插入可以看作两棵左偏树的合并。 下面是插入操作的框架: 因为只执行了一次合并操作,所以插入的时间复杂度为 O(log N)。 Function Insert(x,A) Begin B ← MakeTree(x) A ← Merge(A,B) End 一、删除最小节点实际是就合并根的左右子树的过程。(

文档评论(0)

803322fw + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档