数据结构与算法分析总结

数据结构和算法设计与分析

谈到计算机方面的专业课程,我觉得数据结构算是一门必不可少的课了,它是计算机从业和研究人员了解、开发及最大程度的利用计算机硬件的一种工具。数据结构与算法分析是两门紧密联系的课程,算法要靠好的数据结构来实现,二者的关系是密不可分的,谈到算法不得不讲数据结构,谈数据结构也不可避免的要了解算法,好的算法一定有一个好的数据结构,很多算法实际上是对某种数据结构实行的一种变换,研究算法也就是研究在实行变换过程中数据的动态性质。这两门课程分别是我在大二和研一的时候学的,因为它们密切的联系,这里将其放在一起总结如下。

什么是数据结构呢?研究数据的逻辑结构和存储结构(物理结构)以及它们之间的关系,且为该结构定义相应的运算设计相应的算法。这里的数据是指可输入到计算机能被程序处理的符号的集合。其中,数据的逻辑结构是指数据之间逻辑关系的描述,逻辑结构的分类有线性结构、树形结构和图结构。数据的存储结构是指数据在计算机中存储结构,也称为物理结构,它有4类基本的存储映射方法:1.顺序的方法;2.链接的方法;3.索引的方法;4.散列的方法。在程序设计语言中,数据结构直接反映在数据类型上,比如一个整型变量就是一个节点,根据类型给他分配内存单元。抽象数据类型:一组值以及在这些值上定义的操作集合,它是描述数据结构的一种理论工具,其特点是把数据结构作为独立于应用程序的一种抽象代数结构。

线性表结构:由一系列元素组成的有序的序列,除了第一个元素和最后一个元素外,每个元素都只有一个直接前趋和直接后继,元素的个数称为线性表的长度。它的存储方式有顺序存储和链式存储。顺序存储方式它的优点是存储单元是连续的,适合快速访问元素内容,链表的特点是动态申请内存空间,并通过指针来链接结点,按照线性表的前驱关系把一个个结点链接起来,这样可以动态地根据需要分配内存空间,经常用于插入新结点或删除节点的需要,链表还可以根据结点中指针个数分为单链表、双链表、循环链表等。在线性表结构中有两类特别的线性表:栈和队列。栈是一种限制访问端口的线性表,常称为后进先出表。正是这种特殊的性质使得栈的用途非常广泛,比如在计算表达式的值时处理运算符的先后次序,另外一个大的用处就是递归了,hanoi 塔就是最典型的用了递归的思想,在算法中,也有很多运用递归思想的例子。队列也属于限制访问点的线性表,它的特点就是加入和删除元素都只能在队列的一端进行,即队列首出,队列尾进,最大的特点是先来先服务,先进先出。因

为这个特点,队列常被用作消息缓冲器。

在算法设计中,顺序表主要用于检索,而利用栈中的递归思想在算法中则应用非常广泛,如递归排序,分治算法等。

树结构:是一种非常重要的非线性数据结构,它是由一个根结点和若干叶结点组成的树状结构,除了根结点每个结点只能有一个父节点,可以有若干子结点,若干个树结构还可以构成森林,树的存储结构也分为顺序存储和链式存储,最典型的是左孩子右兄弟法。在树结构中比较重要的算法就是周游(遍历)树,有先根次序、后根次序以及中根次序。树结构中有几类非常重要的特殊树结构,如二叉树,B树,B+树等,其中,二叉树应用最为广泛。

二叉树:是指每个结点最多有两个子结点的树结构,具体细分,根据叶子结点的特性可分为满二叉树、完全二叉树等。二叉树的遍历也分为深度优先和广度优先。另外,二叉树有几条非常重要的性质,这也使得它的应用非常广泛。

在算法设计中,典型的利用树的深度优先遍历的算法是回溯法,而典型的广度优先搜索算法是分枝定界法。

图:是一种较线性表和树更为复杂的数据结构。一般来讲,数据的逻辑结构可表示为结点的有穷集合K和K上的一个关系r,如果对K中结点相对于r的前驱、后继个数加以限制,则可以分别定义线性结构、树形结构和图结构,即:

线性结构:惟一前驱,惟一后继,反映一种线性关系;

树形结构:惟一前驱,多个后继,反映一种层次关系;

图结构:不限制前驱的个数,亦不限制后继的个数,反映一种网状关系。

通常用G=(V,E)代表一个图,其中V是顶点集,E是边集。图分为有向图和无向图,图的存储方式有邻接表和邻接矩阵法。和树类似的,图中也需要周游,同样有深度优先搜索和广度优先搜索,而比树的周游要更复杂,也更重要。在这一块中,有两种比较典型的求最短路径和最小支撑树的算法需要注意,它们分别是Dijkstra算法和Prim算法。另外需要注意的是图的连通性。

在算法设计中,典型的用到图论的算法有贪心算法和动态规划算法。

对于计算机科学来说,算法的概念至关重要。通俗的讲,算法是指解决问题的一种方法或一个过程,或者严格来讲,是由若干条指令组成的有穷序列,且满足以下4条性质;

(1) 输入:有零个或多个由外部提供的量作为算法的输入。

(2) 输出:算法产生至少一个量作为输出。

(3) 确定性:组成算法的每条指令是清晰的,无歧义的。

(4) 有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限

的。

我们研究一个算法或者评价一个算法主要是通过估计该算法的复杂性,包括时间复杂性和空间复杂性。空间复杂性是指使用该算法的程序在运行时需要占用多少内存空间,具体包括指令空间、数据空间和环境栈空间。时间复杂性是指执行该程序所需要的时间量级,通常是估算的时间,包括编译时间和运行时间。同时评价一个算法的好坏还要看其时间复杂性和空间复杂性随着输入规模的增长趋势,一般能接受的最好是线性增长。在算法设计这本书中,每介绍一个算法都会分析其算法复杂度,由此可看出它的重要性。

首先,从递归的分治算法开始。分治算法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归的解这些子问题,然后将各个子问题的解合并得到原问题的解。该算法的主要应用有大整数乘法,矩阵乘法、合并排序等。可以大大降低算法的时间复杂度,但使用递归栈可能增加程序的空间规模。

动态规划算法和贪心算法:与分治算法类似,动态规划的基本思想也是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治算法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是相互独立的。动态规划算法适用于解最优化问题。通常可按以下4个步骤:

(1) 找出最优解的性质,并刻画其结构特征。

(2) 递归的定义最优值。

(3) 以自底向上的方式计算出最优值。

(4) 根据计算最优值时得到的信息,构造最优解。

动态规划算法的基本要素是最优子结构性质和子问题重叠性质。 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。

子问题重叠性质。子问题重叠性质是指在用递归演算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。

另外一点要素是备忘录方法,它作为动态规划算法的变形,用表格保存已解决问题的答

案,在下次需要解此子问题时,只要简单查看子问题的解答,而不必重新计算。与动态规划不同的是备忘录方法的递归是自顶向下的,而动态规划则是自底向上的。

动态规划算法设计策略典型的应用案例有:矩阵连乘、最大字段和、流水作业调度等。 有时满足动态规划条件的问题可以有更好的算法,比如贪心算法。贪心算法即总是做出在当前看来是最好的选择。也就是说贪心算法并不从整体最优上加以考虑,它所做的总是做出的选择只是在某种意义上的局部最优。这种启发式的策略并不能总是奏效,然而对某些特定的问题确能达到预期目的。比如活动安排的例子。

贪心算法的基本要素主要有贪心选择性质和最优子结构性质。所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法与动态规划的主要区别,它们的共同点是都要求问题具有最优子结构性质。

贪心算法的典型案列是:活动安排、最优装载问题、最短路径和最优生成树问题。 回溯法和分枝定界法:回溯法有“通用的解题法”之称。用它可以系统的搜索一个问题的所有解或任一解。它在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树。其算法框架包含递归回溯和迭代回溯,两个特别的解空间树为子集树和排列树。

典型的回溯法的案例有:批处理作业调度、图的m着色、旅行售货员问题、0-1背包问题等。

分枝定界法类似于回溯法,也是在问题的解空间上搜索问题解的算法。一般情况下,分治定界法与回溯法的求解目标不同。回溯法的求解目标是找出解空间中满足约束条件的所有 的解,而分枝定界法的求解目标则是找出满足约束条件的一个解,或是满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。由于求解目标不同,导致分支定界法与回溯法对解空间的搜索方式也不相同。回溯法以深度优先的方式搜索解空间,而分枝定界法则以广度优先或以最小耗费优先的方式搜索解空间。

另外,在算法分析中一定要提的是NP问题。首先需要介绍P(Polynomial,多项式)问题.P问题是可以在多项式时间内被确定机(通常意义的计算机)解决的问题。

NP(Non-Deterministic Polynomial, 非确定多项式)问题,是指可以在多项式时间内被非确定机(他可以猜,他总是能猜到最能满足你需要的那种选择,如果你让他解决n皇后问题,他只要猜n次就能完成----每次都是那么幸运)解决的问题.这里有一个著名的问题----千禧难题之首,是说P问题是否等于NP问题,也即是否所有在非确定机上多项式可解的问题都能在确定机上用多项式时间求解。

NP完全(NP Complete,NPC)问题是指这样一类NP问题,所有的NP问题都可以用多项式时

间划归到他们中的一个。所以显然NP完全的问题具有如下性质:它可以在多项式时间内求解,当且仅当所有的其他的NP-完全问题也可以在多项式时间内求解。这样一来,只要我们找到一个NPC问题的多项式解,所有的NP问题都可以多项式时间内划归成这个NPC问题,再用多项式时间解决,这样NP就等于P了。

小结一下,在算法设计这么课中学了这么几大类典型的算法,里面也涉及到具体的应用案例,但我觉得学算法的目的远不是学会这几种固定的特殊问题的解法而已,事实上领会这些巧妙算法背后的思想然后学会迁移到其他新的问题中去才是领会了算法设计的精髓。

 

第二篇:数据结构与算法总结

《数据结构与算法》课程学习总结报告

0704013015 07计本(3)班 张浩

本学期开设的《数据结构与算法》课程已经告一段落,现就其知识点及其掌握情况、学习体会以及对该门课程的教学建议等方面进行学习总结。

一、《数据结构与算法》知识点

在课本的第一章便交代了该学科的相关概念,如数据、数据元素、数据类型以及数据结构的定义。其中,数据结构包括逻辑结构、存储结构和运算集合。逻辑结构分为四类:集合型、线性、树形和图形结构,数据元素的存储结构分为:顺序存储、链接存储、索引存储和散列存储四类。紧接着介绍了一些常用的数据运算。最后着重介绍算法性能分析,包括算法的时间性能分析以及算法的空间性能分析。

第二章具体地介绍了顺序表的概念、基本运算及其应用。基本运算有:初始化表、求表长、排序、元素的查找、插入及删除等。元素查找方法有:简单顺序查找、二分查找和分块查找。排序方法有:直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序及归并排序等。最后介绍了顺序串的概念,重点在于串的模式匹配。

链表中数据元素的存储不一定是连续的,还可以占用任意的、不连续的物理存储区域。与顺序表相比,链表的插入、删除不需要移动元素,给算法的效率带来较大的提高。链表这一章中介绍了链表的节点结构、静态与动态链表的概念、链表的基本运算(如求表长、插入、查找、删除等)、单链表的建立(头插法和尾插法)以及双向循环链表的定义、结构、功能和基本算法。

堆栈与队列是两种运算受限制的线性结构。其基本运算方法与顺序表和链表运算方法基本相同,不同的是堆栈须遵循“先进后出”的规则,对堆栈的操作只能在栈顶进行;而队列要遵循“先进先出”的规则,教材中列出了两种结构的相应算法,如入栈、出栈、入队、出队等。在介绍队列时,提出了循环队列的概念,以避免“假溢出”的现象。

第六章介绍了特殊矩阵和广义表的概念与应用。其中,特殊矩阵包括对称矩阵、三角矩阵、对角矩阵和稀疏矩阵,书中分别详细介绍了它们的存储结构。稀疏矩阵的应用包括转置和加法运算等。最后介绍了广义表的相关概念及存储结构,关于它的应用,课本中举了m元多项式的表示问题。

第七章二叉树的知识是重点内容。在介绍有关概念时,提到了二叉树的性质以及两种特殊的二叉树:完全二叉树和满二叉树。接着介绍二叉树的顺序存储和链接存储以及生成算法。重点介绍二叉树的遍历算法(递归算法、先序、中序和后序遍历非递归算法)和线索二叉树。二叉树的应用:基本算法、哈弗曼树、二叉排序树和堆排序。

树与二叉树是不同的概念。教材介绍了树和森林的概念、遍历和存储结构,还有树、森林和二叉树的相互关系,树或森林怎样转化成二叉树,二叉树又如何转换为树和森林等算法。 散列结构是一种查找效率很高的一种数据结构。本章的主要知识点有:散列结构的概念及其存储结构、散列函数、两种冲突处理方法、线性探测散列和链地址散列的基本算法以及散列结构的查找性能分析。

最后一章介绍了图的概念及其应用,是本书的难点。图的存储结构的知识点有:邻接矩阵、邻接表、逆邻接表、十字链表和邻接多重表。图的遍历包括图的深度优先搜索遍历和广度优先搜索遍历。其余知识点有:有向图、连通图、生成树和森林、最短路径问题和有向无环图及其应用。有向无环图重点理解AOV网和拓扑排序及其算法。

二、对各知识点的掌握情况

总体来看,对教材中的知识点理解较为完善,但各个章节均出现有个别知识点较为陌生

的现象。现将各个章节出现的知识点理解情况列举如下。

第一章中我对数据和数据结构的概念理解较为透彻,熟悉数据结构的逻辑结构和存储结构。而对算法的时间、空间性能分析较为模糊,尤其是空间性能分析需要加强。

第二章,顺序表的概念、生成算法理解较为清晰,并且熟悉简单顺序查找和二分查找,对分块查找较为含糊;排序问题中,由于冒泡排序在大一C语言课上已经学习过,再来学习感觉很轻松。对插入排序和选择排序理解良好,但是,在实际运用中仍然出现明显不熟练的现象。由于在归并排序学习中感觉较吃力,现在对这种排序方法仍然非常模糊,所以需要花较多的时间来补习。此外串的模式匹配也是较难理解的一个地方。

链表这一章中,除对双向循环链表这一知识点理解困难之外,其他的知识点像单链表的建立和基本算法等都较为熟悉。

接下来的有关堆栈以及队列的知识点比较少,除有关算法较为特殊以外,其余算法都是先前学过的顺序表和链表的知识,加上思想上较为重视,因此这部分内容是我对全书掌握最好的一部分。不足之处仍然表现在算法的性能分析上。

在学习第六章时感觉较为吃力的部分在于矩阵的应用上,尤其对矩阵转置算法的C语言描述不太理解。稀疏矩阵相加算法中,用三元组表实现比较容易理解,对十字链表进行矩阵相加的方法较为陌生。

第七章是全书的重点,却也有一些内容没有完全理解。在第一节基本概念中,二叉树的性质容易懂却很难记忆。对二叉树的存储结构和遍历算法这部分内容掌握较好,能够熟练运用,而对于二叉树应用中的哈弗曼树却比较陌生。

第八章内容较少,牵涉到所学的队列的有关内容,总体来说理解上没有什么困难,问题依旧出现在算法的性能分析上。

散列结构这一章理解比较完善的知识点有:基本概念和存储结构。散列函数中直接定址法和除留余数法学得比较扎实,对数字分析法等方法则感觉较为陌生。对两种冲突处理的算法思想的理解良好,问题在于用C语言描述上。

最后一章,图及其应用中,图的定义、基本运算如图的生成等起初理解有困难,但随着学习深入,对它的概念也逐步明朗起来。邻接矩阵、邻接表和逆邻接表掌握较好,而对十字链表和邻接多重表则较为陌生。感觉理解较为吃力的内容还有图的遍历(包括深度和广度优先遍历),最小生成树问题也是比较陌生的知识点。最短路径和AOV网学习起来感觉比较轻松,而对于C语言描述却又不大明白。

三、学习体会

接触这门课程以前,我对该课程所学的内容有许多疑点,例如:这门课是否是在介绍一种新的计算机语言?如果不是,那么学习这门课程的用途是什么?为什么市面上各种介绍数据结构的资料采用了不同的计算机语言,如C、C++还有Java?我的C语言学得不好,对学习这门课是否有影响??

在学习伊始,老师就明确提出它不是一种计算机语言,不会介绍新的关键词,而是通过学习可以设计出良好的算法,高效地组织数据。一个程序无论采用何种语言,其基本算法思想不会改变。联系到在大一和大二上学期学习的C和C++语言,我深刻认识到了这一点。“软件开发好比写作文,计算机语言提供了许多华丽的辞藻,而数据结构则考虑如何将这些辞藻组织成一篇优秀的文章来。”在学习这门课中,要熟悉对算法思想的一些描述手段,包括文字描述、图形描述和计算机语言描述等。因此,计算机语言基础是必须的,因为它提供了一种重要的算法思想描述手段——机器可识别的描述。

这门课结束之后,我总结了学习中遇到的一些问题,最为突出的,书本上的知识与老师的讲解都比较容易理解,但是当自己采用刚学的知识点编写程序时却感到十分棘手,有时表现在想不到适合题意的算法,有时表现在算法想出来后,只能将书本上原有的程序段誊写到

自己的程序中再加以必要的连接以完成程序的编写。针对这一情况,我会严格要求自己,熟练掌握算法思想,尽量独立完成程序的编写与修改工作,只有这样,才能够提高运用知识,解决问题的能力。

四、对《数据结构与算法》课程教学的建议

1、建议在上课过程中加大随堂练习的分量,以便学生能当堂消化课堂上学习的知识,也便于及时了解学生对知识点的掌握情况,同时有助于学生保持良好的精神状态。

2、建议在课时允许的情况下,增加习题课的分量,通过课堂的习题讲解,加深对知识点的掌握,同时对各知识点的运用有一个更为直观和具体的认识。

以上便是我对《数据结构与算法》这门课的学习总结,我会抓紧时间将没有吃透的知识点补齐。今后我仍然会继续学习,克服学习中遇到的难关,在打牢基础的前提下向更深入的层面迈进!

相关推荐