NOIP中常用的数据结构.ppt

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

NOIP中常用的数据结构 清华大学 钱桥 主要内容: 堆 单调队列 并查集 例:首先给你n个数,之后进行n次操作,操作有两种: 1、询问最小值,并将它删除 2、插入一个新的数x 堆 思路1:用数组存这些数 询问时,扫描一遍最小值,并将它删除 O(n) 插入时,将它放在数组最后 O(1) 总时间复杂度 O(n^2) 思路2:仍然用数组存这些数,排序!从小到大存储 询问时,第一个即最小值 O(1) 删除最小值时,标记前移 O(1) 插入时,可通过二分找到插入位置 O(LogN) 但插入这个数后,后面的数要整体平移 O(n) 时间复杂度 O(n^2) 思路3:用链表存这些数,从小到大有序存储 询问时,第一个即是最小值,并将它删除 O(1) 插入时,若找到位置,可直接插入 O(1) 但链表上无法二分查找,查找需整体扫描 O(n) 总时间复杂度 O(n^2) 例:首先给你n个数,之后进行n次操作,操作有两种: 1、询问最小值,并将它删除 2、插入一个新的数x 堆 堆~闪亮登场! 插入一个数 O(LogN) 删除一个数 O(LogN) 查询最小值 O(1) 总时间复杂度 O(NLogN) 堆 堆是一棵完全二叉树 深度为LogN! 给节点顺序标号1~n i 2*i 2*i+1 只需用数组A[1]~A[n]存储 堆 从根到每个叶节点的路径都是单调递增的 最小值是根! O(1)查找最小值 接下来我们的任务是: 1、插入一个数,在O(LogN)时间内,把结构恢复成堆 2、删除最小值,在O(LogN)时间内,把结构恢复成堆 *3、删除一个指定元素,在O(LogN)时间内,把结构恢复成堆 堆 1、插入一个元素z 不关心大小,只关心位置 如何调整? 显然,xy x y 情况1:z=x 完美结束 z 情况2:zx 堆 1、插入一个元素z 不关心大小,只关心位置 如何调整? 显然,xy z y 情况1:z=x 完美结束 x 情况2:zx 将x和z互换位置,显然zy,以z为根的子树一定是堆 翻页继续! 1、插入一个元素z x y z 堆 显然,uw 情况1:z=u 完美结束 情况2:zu u w 1、插入一个元素z x y u 堆 显然,uw 情况1:z=u 完美结束 情况2:zu 将u和z互换位置,显然zw,以z为根的子树一定是堆 继续操作,直至某次“完美结束”或z被移动到根为止。 z w 最多做LogN次! 堆 1、插入一个元素z 程序实现 n++; a[n]=z; i = n; while (i1) { if (a[i] a[i/2]) { t = a[i]; a[i] = a[i/2]; a[i/2] = t; i = i / 2; } else break; } n++; i =n while (i1) { if (z a[i 1]) { a[i] = a[i 1]; i = i 1; } else break; } a[i] = z; 堆 2、删除最小值 最小值是谁? 删除一个数后结构是什么样? 第一步:删除最小值 第二步:把下面的数z移动上来 第三部:调整

文档评论(0)

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

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

1亿VIP精品文档

相关文档