数据结构学习

我发现在学习数据结构的过程中每次都有这样的困惑,各种类型的书都看了一下,如果书上写的简单一点那么自己就会一带而过,如果书上数学公式算法分析一大堆,那真是不堪入眼,看的一点兴趣全无,以至于一道走来,简单的没完全会,难的一点没懂,不断的停留一个阶段,上下两难。而现在时间紧迫,我想要在毕业之前认真的学完数据结构与算法。经过上面多次的困惑,我觉得要真正从纸质书本上学到东西,得走出来,得站在作者的角度去学习思考,统筹规划每一章的内容,每一个知识点。因此我打算以作者的思维去记录数据结构学习中的每一个问题,就想象这本书是我写的吧。


这是第一篇,当然和大多数书上一样,介绍数据结构和算法的基本概念。我认为以下概念比较重要。
一:数据,在我们程序设计中数据是指能够输入到计算机中,然后能够被计算机程序所处理的符号。这些符号包括文字,声音,图 片,视频等等。
二:结构,结构是指事物之间内在的联系,比如分子的结构则是指分子之中原子的排列方式,那么数据的结构则是指数据与数据之间的联系方式。
三:数据元素,数据元素就是我们数据结构中要研究的对象,比如要研究书的话,那么书就是一个数据元素。
四:数据项,我们研究的对象数据元素,可能具有多个属性,比如书有编号,有价格。那么这些属性我们就叫做数据项。 数据项是数据结构中最小的单位。
五:抽象数据类型,抽象就是更通用的意思,抽象数据类型就是指将底层的数据类型进行了封装使他满足各种数据类型的操作或者是自定义的数据类型 即程序设计者根据具体情况创建的,比如进程,文件它都是一种抽象数据类型(因为适合所有的进程、文件),另外他还包含在这种类型基础上定义的一组操作,通用于各个底层类型。这个概念相当重要。(linux编程中经常遇到)

下面是抽象数据类型的描述:

然后就是算法的一些知识点: 
1,算法:算法就是对特定问题求解步骤的描述,在计算机中表示为指令的有限序列,每条指令包含一个或者多个操作。
2,算法的特性:五个特性,输入性(0个或者多个)、输出性(至少有一个,不然算法哪来意义)、有穷性(指经过有限个步骤之后能够得出结果,时间上有要求)、确定性(意思明确,不要有二义性)、可行性(即能够花时间精力去研究)    
3,对算法分析的要求:正确性,有四个层次(源代码无语法错误,对合法的输入能够得到正确结果,对非法输入也能得到合理的结果,对极少数的个别刁展输入也能得合理结果);可读性(这个很重要,便于维护);健壮性(对非法输入能够异常处理);高效率和低存储空间。
4,算法度量的方法:一个是事后统计方法(明显的不科学,不准确,依赖于具体的机器),另一个是事前估算方法(考虑输出规模的执行次数)
5,算法的时间复杂度:即求大O阶,常有的大O阶有(O(1) < O(logn)<O(n)<O(nlog)<O(n的平方)<O(n的三次方阶)),算法时间复杂度对计算算法的优劣是很重要的,不能忽视。

最后就是数据结构与算法的关系:这个问题我也考虑了很久,最近看到书上是这样描述的,我觉得很不错。他说算法与数据结构就像罗密欧与朱丽叶,是紧密相连的。单纯考虑数据结构是没什么意义的,数据结构的逻辑关系就那么几种(线性,树,图啊)一下子就描述清楚了,因此关键的是建立在这种数据结构上的算法,这也是科学家们之所以创建这些数据结构的原因,就是为了解决实际问题。因此我们在学习数据结构的过程中首先要从逻辑上理解这种数据结构的功能以及优缺点,理解科学家们为什么创建他,然后更重要的是要能够实现依附于这种数据结构的操作,即用这种数据结构所能解决的事情。(比如游戏玩家的装备是时常增添和删除的,因此可以采用线性表的链式结构来进行这种插入和删除操作)。

--------------------------------

更新:2014-7-12

数据结构这门课程存在的意义就是为了优化程序。理论上所有的程序都可以用链表实现,只不过实现起来的效率存在高和低。

算法和数据结构的关系:一种算法可以用各种数据结构来实现,可能是特定环境下用某种数据结构更好。要积累一些他们之间相辅相成的具体例子。

--------------------------------

原文地址:https://www.cnblogs.com/rookiefly/p/3420971.html