史宁高级数据结构讲义.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
史宁高级数据结构讲义

高级数据结构讲义 西安电子科技大学ACM基地 史宁 几类常见的高级数据结构 二叉堆 树状数组 并查集 平衡树 哈希表 虚二叉树 二叉堆 二叉堆是一个严格的完全二叉树,它的特点就是可以在O(logn)的时间内对元素进行插入和删除,并且可以在O(1)的时间内找到最大元素或者最小元素。通常我们把根节点为整个树中最小元素的二叉堆叫做小根堆,反之则为大根堆。 下面我们看一个二叉堆的实例,并给大家进行讲解。 二叉堆的示例 堆在同层次上是无序的,也就是说堆的关系只是本节点与子节点和父节点之间的关系,与兄弟节点无关。 它的存储结构可以是顺序存储,因为它是一个完全二叉树,已知一个节点的下标,我们很轻易的就知道他的子节点和父节点的下标。 二叉堆的存储结构 一般情况下我们都采用连续一段数组的存储方式来存储二叉堆,就像刚刚实例中所看到的一样。已知一个节点n,它的父节点为n/2(这里为整除),而他的左孩子节点为n*2,右孩子为n*2+1。 基于二叉堆这么多美好的性质。所以说,堆排序也就是基于二叉堆来实现的,它的时间复杂度为O(nlogn)。 二叉堆的插入代码分析 void push(int a) //a为插入的关键字 { int temp,w; n++; s[n]=a; w=n; while ((w!=1)(s[w]s[w/2])) //逐层调整关键字的位置 { if (s[w]s[w/2]) { temp=s[w]; s[w]=s[w/2]; s[w/2]=temp; } w=w/2; } 树状数组 树状数组是寻找一段连续空间内,关键字的个数。它的查找和维护时间复杂度均为O(nlogn) 树状数组的特点 C1=a1 C2=a1+a2 C3=a3 C4=a1+a2+a3+a4 C5=a5 …… C8=a1+a2+a3+a4+a5+a6+a7+a8 …… C2^n=a1+a2+….+a2^n Lowbit函数 int lowbit(int a) { return a-a; } 树状数组实例 POJ2352,我们用树状数组来解决一下这个题目 题目描述:平面有一些星星,这些星星都有自己的等级,等级是按照它左下方的星星个数来决定的。求从0级~n-1级的星星个数。 POJ 2352 我们可以看到标号5的星星的级别是3(左下方有1,2,4)。 0级星星的个数有1个,1级有2个,2级有1个,3级有1个,4级有0个。 POJ 2352 首先我们按照Y坐标对数据进行排序,Y相同的按X坐标排序,因为题目给出是按照此升序排列,固我们可以省略这个步骤 排序完成,这个题目就变得显而易见了。按序对每个坐标进行两个操作,一个操作就是判定星星的级别,在一个就是使这个星星右上方的所有星星级别加一,下面我们分别看下这两个程序段。 判定星星的级别 int getsum(int a) { int t; t=0; while (a0) { t=t+c[a]; a=a-lowbit(a); } return t; //返回值t为星星的级别 } 修正右上方星星级别 void change(int a) { int k; k=a; while (k=32010) { c[k]++; k=k+lowbit(k); } } 并查集 并查集是针对集合之间的操作,有合并两个集合,寻找关键字所在的集合等。 并查集查找的平均复杂度为O(logn),而合并的复杂度则为O(1)。 并查集操作与优化 合并操作 合并两个集合 查找操作 查找元素所在的集合 路径压缩 在查找的时候进行路径压缩可以增加效率 查找操作 查询关键字所在的集合。 查找操作代码分析 int find(int a) { while (father[a]!=a) a=father[a]; father[a]=a; return a; } 合并操作 将两个集合合并成为一个集合。 合并操作代码分析 void union(int a, int b) { int x,y; x=find(a); y=find(b); if (x!=y) father[y]=x; } 小结 以上我所讲的三类数据结构都有一个共同的特点,这个特点就是他们的结构都是基于树或者二叉树。 二叉堆:一个集合中元素的极值 树状数组:维护某个区间内的元素 并查集:多个集合元素之间的关系

文档评论(0)

shujukd + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档