算法合集之《基本数据结构在信息学竞赛中应用》.pptVIP

算法合集之《基本数据结构在信息学竞赛中应用》.ppt

  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文档。上传文档
查看更多
基本数据结构在信息学竞赛中的应用 安徽省芜湖市第一中学 朱晨光 IOI2006中国国家集训队论文 安徽省芜湖市第一中学 朱晨光 引言 题目难应用高级数据结构 基本数据结构! 本篇论文将介绍几种基本数据结构在信息学竞赛中的应用,并通过几道例题集中体现这些数据结构的重要作用。 编程复杂度高 容易出错 第一部分——基本数据结构的介绍 一、线性表(线性表的顺序存储结构) 线性表 二、线性表的链式存储结构 线性链表: 线性表的链式存储结构 循环链表: 线性表的链式存储结构 双向链表: 栈 队列 第二部分——基本数据结构的应用 栈的应用 [例1] 求01矩阵中最大的全零矩形 线性表的应用 [例2] 营业额统计 队列的应用 [例3] 瑰丽华尔兹 线性表的应用——营业额统计 给定N(1≤N≤32767)天的营业额a1,a2,……,an. 定义一天的最小波动值等于 min{|该天以前某一天的营业额-该天营业额|} 特别地,第一天的最小波动值即为a1 试求N天的最小波动值之和 例如:N=3,a1=9,a2=3,a3=8,则各天最小波动值依次为9,6,1,和为16 分析 这道题目的规模很大,如果简单地用两重循环解决,时间复杂度高达O(N2),难以满足要求。 算法低效的原因在于没有高效地将数据组织起来,而是松散地存储在数组中,导致对于每一个营业额都需要检查前面所有的营业额。 分析 实际上,有一种高级数据结构——平衡树可以解决这个问题。我们可以在将一天的营业额插入平衡树的过程中得到该天的最小波动值。方法是求出所有在插入路径上的数字与改天营业额差的绝对值,从中取出最小值。这种算法的时间复杂度为O(Nlog2N). 进一步改进 平衡树左旋,右旋,双旋…… 高效 高出错率 Yes! 那么,基本数据结构能否在这里得到应用呢? 应用基本数据结构——双向链表 将这N个元素进行排序,得到序列c,同时记录原来第i个元素在排序后的位置bi 将排序后的序列在静态数组中建成一个双向链表 按照从an到a1的顺序依次处理每个元素 双向链表 对于an,查看bn的前驱pre[bn]与后继next[bn]所指的数 最小波动值必然是an与这两个数中的某一个的差的绝对值 处理完an后,我们把它从双向链表中删除,接着处理an-1 动画演示 最小波动值为min{|8-3|,|8-9|}=min{6,1}=1 最小波动值为min{|3-9|}=6 9 最小波动值为9 最小波动值总和为1+6+9=16 时间复杂度分析 排序 O(Nlog2N) 建表 O(N) 处理 O(N) O(Nlog2N) 小结 平衡树 编程复杂度高 基本数据结构——双向链表 没有增加时间复杂度 大大降低编程复杂度 思路清晰 见解独到 队列的应用——瑰丽华尔兹 给定一个N行M列的矩阵,矩阵中的某些方格上有障碍物。有一个人从矩阵中的某个方格开始滑行。每次滑行都是向一个方向最多连续前进ci格(也可以原地不动)。但是这个人在滑行中不能碰到障碍物。现按顺序给出K次滑行的方向(东、南、西、北中的一个)以及ci ,试求这个人能够滑行的最长距离(即格子数)。 数据范围:1≤N,M≤200,K≤200, ≤40000 样例 障碍 分析 本题是一个求最值的问题。根据题目中K次滑行的有序性以及数据范围,可以很容易设计出这样一种动态规划算法: 动态规划的状态转移方程如下 :(这里只给出向右滑行的转移方程) f(0,startx,starty)=0 f(k,x,y)=max{f(k-1,x,y),f(k-1,x,y-1)+1,f(k-1,x,y-2)+2,……,f(k-1,x,y’)+y-y’} (其中y’为满足y’=1或(x,y’-1)上有障碍或y’=y-ck的最大值) 令f(k,x,y)=此人k次滑行后到达(x,y)方格时已经滑行的最长距离。 时间复杂度分析 现在来分析这个动态规划算法的时间复杂度: 显然,状态总数为O(KMN),而每次状态转移在最坏情况下的时间复杂度为O(max{M,N}),因此总的时间复杂度为O(KMN*max{M,N})=O(1.6*109),难以承受。 因此,我们需要对这个动态规划算法进行优化! 分析 分析 对于一个具体的例子k=2,x=1,c2=2可以列出如下等式: f(2,1,1)=max{f(1,1,1)} f(2,1,2)=max{f(1,1,1)+1,f(1,1,2)} f(2,1,3)=max{f(1,1,1)+2,f(1,1,2)+1,f(1,1,3)} f(2,1,4)=max{f(1,1,2)+2,f(1,1,3)+1,f(1,1,4)} …… 分析 如果我们定义一个序列a,使得ai=f(1,1,i)-i

文档评论(0)

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

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

1亿VIP精品文档

相关文档