算法合集之“基本数据结构在信息学竞赛中的应用”.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国家集训队论文 基本数据结构在信息学竞赛中的应用 安徽省芜湖市第一中学 朱晨光 引言 题目难?应用高级数据结构 第一部分——基本数据结构的介绍 一、线性表(线性表的顺序存储结构) 线性表 二、线性表的链式存储结构 线性表的链式存储结构 线性表的链式存储结构 双向链表: 栈 队列 第二部分——基本数据结构的应用 线性表的应用——营业额统计 给定N(1≤N≤32767)天的营业额a1,a2,……,an. 定义一天的最小波动值等于 min{|该天以前某一天的营业额-该天营业额|} 特别地,第一天的最小波动值即为a1 试求N天的最小波动值之和 分析 这道题目的规模很大,如果简单地用两重循环解决,时间复杂度高达O(N2),难以满足要求。 分析 实际上,有一种高级数据结构——平衡树可以解决这个问题。我们可以在将一天的营业额插入平衡树的过程中得到该天的最小波动值。方法是求出所有在插入路径上的数字与改天营业额差的绝对值,从中取出最小值。这种算法的时间复杂度为O(Nlog2N). 进一步改进 应用基本数据结构——双向链表 将这N个元素进行排序,得到序列c,同时记录原来第i个元素在排序后的位置bi 双向链表 对于an,查看bn的前驱pre[bn]与后继next[bn]所指的数 最小波动值必然是an与这两个数中的某一个的差的绝对值 处理完an后,我们把它从双向链表中删除,接着处理an-1 动画演示 时间复杂度分析 小结 队列的应用——瑰丽华尔兹 给定一个N行M列的矩阵,矩阵中的某些方格上有障碍物。有一个人从矩阵中的某个方格开始滑行。每次滑行都是向一个方向最多连续前进ci格(也可以原地不动)。但是这个人在滑行中不能碰到障碍物。现按顺序给出K次滑行的方向(东、南、西、北中的一个)以及ci ,试求这个人能够滑行的最长距离(即格子数)。 数据范围:1≤N,M≤200,K≤200, ≤40000 样例 分析 本题是一个求最值的问题。根据题目中K次滑行的有序性以及数据范围,可以很容易设计出这样一种动态规划算法: 时间复杂度分析 现在来分析这个动态规划算法的时间复杂度: 分析 分析 对于一个具体的例子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+1,则以上等式可以写成: f(2,1,1)=max{a1}=max{a1} f(2,1,2)=max{a1+1,a2+1}=max{a1,a2}+1 f(2,1,3)=max{a1+2,a2+2,a3+2}=max{a1,a2,a3}+2 f(2,1,4)=max{a2+3,a3+3,a4+3} =max{a2,a3,a4}+3 …… 分析 现在,让我们加入对障碍物的考虑 分析 应用基本数据结构——队列 队列的操作 动画演示 时间复杂度分析 一个元素最多被插入一次,删除一次 小结 总结 总结 算法步骤 输入N,a1,a2,a3,……,an 将a1,a2,a3,……,an按照从小到大的顺序排序,得到序列c1,c2,c3,……,cn,并记录下每个ai在新序列中的位置bi 在新的序列上建立双向链表 按照从an到a1的顺序依次处理每个元素 输出结果 算法步骤 以滑行次数K作为阶段进行动态规划 状态转移时,对于矩阵中的每一行: 队列置空 遇到障碍:队列置空,处理下一个元素 若队头元素与当前元素的下标相差大于ck ,删除队头元素 删除队尾所有不大于当前a值的元素 在队尾插入a值 队头a值即为队列中所有元素最大值 处理下一个元素 在一行中,插入与删除的总时间复杂度为O(max{M,N}) 每次询问最大值的时间复杂度仅为O(1) 此算法的时间复杂度为O(KMN) Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0. Copyright 2004-2011 Aspose Pty Ltd. 动态规划 状态转移的时间复杂度太高 线段树 编程复杂度高 时间复杂度仍不能令人满意 队列 降低了时间复杂度 减少了编程错误的可能性 Evaluation only. Created with Aspose.Slides for .NET 3.5 Client

文档评论(0)

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

分享好文档!

1亿VIP精品文档

相关文档