从数据结构看算法.docVIP

  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文档。上传文档
查看更多
从数据结构看算法

从数据结构看算法 摘 要:算法 + 数据结构=程序。设计算法与选择合适的数据结构是程序设计中相辅相成的两方面,缺一不可。数据结构的选择一直是程序设计中的重点、难点,正确地应用数据结构,往往能带来意想不到的效果。反之,如果忽视了数据结构的重要性,对某些问题有时就得不到满意的解答。通过树与图论问题的简单分析,我们可以看到两种不同的数据结构在解题中的应用,以及由此得到的不同的算法效率。下面,我试图就数据结构的选择对算法效率的影响做些简单探讨。 关键字:数据结构的选择,线性结构,树形结构 1 引言 算法通常是决定程序效率的关键,但一切算法最终都要在相应的数据结构上实现,许多算法的精髓就是在于选择了合适的数据结构作为基础。在程序设计中,不但要注重算法设计,也要正确地选择数据结构,这样往往能够事半功倍。 在算法时间与空间效率的两方面,着重分析时间效率,即算法的时间复杂度,因为我们总是希望程序在较短的时间内给出我们所希望的输出。如果在空间上过于“吝啬”而使得时间上无法承受,对解题并无益处。 2 离散化及算法框架 算法的研究对象是超一维的线段,但这并不等于逐一枚举,那样耗时过大,而整体考虑又使得问题无从下手。有一种考虑方法是折中的,即既不研究每一条超元线段,也不同时研究所有的超元线段,而是再进一步优化问题的离散化,即将超元线段分组研究。对夹在两条纵向分割边的线段自然地分为一组,它们的共同点是长度相同,并且端点的横坐标相同。纵向线段也可以进行类似的离散化。 这样的离散化处理后,使得问题规模降低,以此为基础,算法的框架可以基本确定为: 1)对平面进行分割。 2)累加器由0到ans。 3)研究每组超元线段,检测其中属于轮廓的部分的长度,并把这一长度累加入ans。 4)输出ans的值。 以上只是算法的基本框架,还很粗糙,求精部分有赖于数据结构的具体选择。 通过求解问题对数据结构选择作的分析中,我们注意到在选择数据结构需要考虑的几个方面: 1)数据结构要适应问题的状态描述。解决问题时需要对状态进行描述,在程序中,要涉及到状态的存储、转换等。选择的数据结构必需先适用于描述状态,并使对状态的各种操作能够明确地定义在数据结构上。树与图论问题的研究中,涉及到算法的状态是关于一组“超一维线段”的描述,目的是要确定该组超一维线段的数目,我们选择了线性结构,采用计数扫描的方法,统计超一维线段属于轮廓的数目。这种表示法直观、易于实现,可以说基本适用于描述状态。但采用一维数组,效率并不高,一次扫描耗时较大。其中主要的原因是各组超元线段的扫描分别独立,后面的扫描并不能利用前面的结论。 2)数据结构应与所选择的算法相适应。数据结构是为算法服务的,其选择要充分考虑算法的各种操作,同时数据结构的选择也影响着算法的设计。我们有这样的认识和经历,如果算法是对一个队列进行堆排序,就应当选择能够迅速定位的数据结构,如一维数组等,而不应选择像链表这样定位耗时的数据结构,反之,如果要对一个链表进行排序,则基于链表结构的基数排序应当是首选对象。树与图论问题的算法思想基于问题的离散化,需要对平面进行分割,记录分割点的坐标。通常,使用映射来记录分割点。采用数组形式,利用其下标与数组元素的自然对应,实现映射,直截了当。这样选择基本可以满足算法要求。 同时,在选择数据结构时,也要考虑其对算法的影响。数据结构对算法的影响主要在两方面: 数据结构的存储能力。如果数据结构存储能力强、存储信息多,算法将会较好设计。反之对于过于简单的数据结构,可能就要设计一套比较复杂的算法了。在这一点上,经常体现时间与空间的矛盾,往往存储能力是与所使用的空间大小成正比的。 定义在数据结构上的操作。“数据结构”一词之所以不同于“变量”,主要在于数据结构上定义了基本操作,这些操作都有较强的实际意义。这些操作就好比工具,有了好的工具,算法设计也会比较轻松。树与图论问题的研究中选择了线性结构,它定义的操作比较简单,因此无法很好地将不同组的超元线段统计联系起来。 总的来说,数据结构的选择同时要兼顾编程的方便。 许多复杂的数据结构能够得到较好的效率,但编程复杂,不易实现且容易出错。在这种情况下,如果能够选择一种我们较为熟悉的又不会过多地降低程序效率的数据结构,倒不失为一种折中的办法。如在某个问题中,要求得到某个矩形边对应的映射编号。我们定义的映射仅仅是编号坐标值,并不是坐标值编号。如果再实现这一映射,势必增加编程难度。所以编程求精时,可以认为以整数而不是以顶点坐标对平面进行横向切割。这样映射关系很好建立,坐标值本身就是编号,减少了编程难度。如果进一步以顶点坐标作横向切割,当然会提高程序效率,但效果并不明显——扫描计数仍需要O(N)的时间,这是很昂贵的,所以进一步切割并不影响算法主要部分的效率,另一方面,编程难度却会大大提高,得不偿失

文档评论(0)

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

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

1亿VIP精品文档

相关文档