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