未完待续。。。。。。
尼采:人们无法理解他没有经历过的事情。
我们只能接受过去已经理解的事物相关的信息。
这个观点与我最近的感悟也是不谋而合。比如在我没认知财务自由是什么之前,这个词在我脑海中一点印象也没有,等我认知到合格词之后,感觉全世界的人都在谈论财务自由了。还有一个例子就是在我看网络相关的书的时候,等我读完了《图解TCP/IP》之后,很多问题我就会试着从网络的角度去分析,这是在我没接触计算机网络之前根本不可能发生的事。
对上面的话进一步的理解是,当我们接触过一种事物之后,我们会在它身上投入更多的注意力。可以说我们接触的东西越多,接触的越深,我们分析问题的角度就越广泛。
比如在没有人跟我说脏脏包之前,我的世界里从来没有这个词,但是当又一次我朋友在我面前买了这个东西之后,我每次去蛋糕店或者路过奶茶店的时候,总是能有意无意的看到脏脏包。
第一章 数据结构绪论
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
划重点:存在关系,集合。
换句话说,数据结构,数据之间的结构,也就是数据之间的组织形式。
数据结构是一门研究非数值计算的程序设计问题中的操作对象。
术语
-
数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。
-
数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被成为记录。
-
数据项:一个数据元素可以由若干个数据项组成。数据项是数据不可分割的最小单位。
-
数据对象:是性质相同的数据元素的集合,是数据的子集。
-
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
逻辑结构与物理结构
逻辑结构
逻辑结构是指数据对象中数据元素之间的互相关系。
- 集合结构:集合中的数据元素除了属于同一个集合外,他们之间没有其他的关系。让我联想到了一袋豆子。
- 线性结构:线性结构中数据元素之间是一对一的关系。一个连着一个,让我想到了一串枣肠。
- 树形结构:树形结构中的数据元素之间存在一种一对多的层次关系。让我联想到了家族族谱,我的上一辈有那么多人,他们每个人的上一辈又有那么多人,这就是一种很形象的树形结构了。
- 图形结构:图形结构的数据元素是多对多的关系。让我联想到了朋友关系网,任意两个人都可能有关系,从整体看没有源头,而每个人都可能是源头。
物理结构
物理结构是指数据的逻辑结构在计算机中的存储形式。
- 顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。数组就是这样的存储结构。
链式存储结构:把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。但是需要用一个指针存放数据元素的地址,这样通过地址就可以找到相关联的数据元素的位置。就像谍战片里有些情节描述的,每个人都有一个上线一个下线,而他们之间也是单线联系的,任何一个人都不可能脱离上线或下线把消息传递出去。这个就和链式存储结构的概念很像了。
划重点:逻辑结构是面向问题的,而物理结构是面向计算机的,其基本的目标就是将数据及其逻辑关系存储到计算机的内存中。
抽象数据类型(ADT)
数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。类型就是用来说明变量或表达式的取值范围和所能进行的操作。
可以按照取值的不同,数据类型可以分成两类:
- 原子类型:是不可以再分解的基本类型,包括整型、字符型
- 结构类型:有若干个类型组合而成的,是可以再次分解的。
抽象是一种思考问题的方式,它隐藏了繁杂的细节,只保留实现目标所必须的信息。
抽象数据类型(Abstract Data Type,ADT):是指一个数据模型及定义在该模型上的一组操作。抽象的意义在于数据类型的数学抽象特性。抽象数据类型体现了程序设计中问题分解、抽象和信息隐藏的特性。
1 |
//这个很重要,真的是将抽象数据类型的定义给抽象出来了,我说的很抽象啊。。。 |
第二章 算法
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
数据结构和算法的关系
在我看来,数据结构就是基础、是工具,就像1、2、3、4这些数字,A、B、C、D这些字母,你、我、爱、他这些汉字,是一样的,它是一种基础学科,也是一种抽象。而算法就是在数据结构的基础上,加上各种运算步骤,就是算法。所以说数据结果是算法的基础。而算法应用数据结构处理各种问题。
两种算法的比较
在书中,作者举例个例子,将1到100相加得到最终的结果,最最直观的做法就是从1开始一直加到100,而高斯算法是(1+100)* 100 /2,只用一步三个运算就搞定了。从性能上分析一眼就看出高低了,第一种做法要99次运算,而第二种做法只需要3次运算。而这只是100个数的加法,如果是1亿、10亿、万亿个数相加呢,他们的差距简直是太大了。所以一个优秀的算法是很关键的。
算法的特性
五个基本特性:输入、输出、有穷性、确定性、可行性。
-
输入输出:算法具有零个或多个输入,算法至少有一个或多个输出。
-
有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
-
确定性:算法的每一步都具有确定的含义,不会出现二义性。
-
可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。还有整体的可行性,如果说一个算法要用到100万台计算机同时运行1年,高级的机构可能会这么做,对于我们普通人来说,这就是个只能听不能用的算法,哪怕它再优秀。
算法设计要求
-
正确性:是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。
-
可读性:算法设计的另一个目的是为了便于阅读、理解和交流。可读性高有助于人们理解算法,晦涩难懂的算法往往隐含着错误,不易被发现,并且难于调试和修改。
-
健壮性:当输入数据不合法时,算法也能做出相关处理,而不是生产异常或莫名其妙的结果。
-
时间效率高、存储量低(灰常重要):设计算法应该尽量满足时间效率高和存储量低的需求。在生活中,我们也是希望话最少的钱用最短的时间办最大的事,算法也是一样的思想。
算法效率的度量方法
事后统计法
事前
第三章 线性表
第四章
第五章
第六章
第七章
第八章
第九章
第十章
总结
一定要好好学,这是算法的基础
这本书真的很好,为什么入门时期的时候没看呢
不过现在来看也还是不错的,收获满满
感谢
《大话数据结构》程杰
本文作者: qizikuai
本文链接: http://qizikuai.github.io/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
近期评论