《大话数据结构》-程杰 著 阅读笔记day1
为何会读这本书?
算上实习工作三年,一直是不温不火,行尸走肉般的在不大不小的公司上下班,签到打卡(相信很多刚毕业的人都会有这种体会,告诉我,我不是一个人QAQ)。前一段时间找工作的时候,看了看阿里,网易等知名互联网公司的招聘要求,发现除了对招聘岗位的技能要求之外,也都会有数据结构和设计模式这一块的要求,但是对这一块特别空白,简历连投都不敢投,为了有更大的空间和提升,我觉得有必要静下心来学习和掌握这两块技术。
但是数据结构这东西,怎么说,很复杂很烧脑,借了同事同学的书看了看,那是相当不好啃,于是百度一顿搜,终于选定了这本程杰著的《大话数据结构》一书作为我自学数据结构的第一本书,并决定记录一下我的学习过程和总结感想。
数据结构非常有趣
“数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学得很累。数据结构非常有趣,很多算法是智慧的结晶,学习它是去感受计算机编程技术的魅力”这是书中前言作者的原话,也是我目前的困惑和选择这本书最主要的原因,我想找到数据结构的魅力所在。
还有一点很有意思的是这本书的目录足足有16页,基本对每一个大标题小标题都有一句点睛语录记录在上面,对我来讲很加分,哈哈,扯远了,拉回来。
下面就是正文的阅读,今天就对第一章数据结构绪论做个笔记和总结思考。
第一章 数据结构绪论
数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。
也就是说,我们这里所说的数据,其实就是符号,而且必须具备两个前提:
*可以输入到计算机中。
*能被计算机程序处理。
对于整型、实型等数值类型,可以进行数值计算。对于字符数据类型,就需要进行非数值的处理,声音、图像、视频等可以通过编码的手段变成字符数据来处理。
数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也称为记录。
数据项:一个数据元素可以由若干个数据项组成。
这里需要注意的是数据项是数据不可分割的最小单位。但真正讨论问题的时候,数据元素才是数据结构中建立数据模型的着眼点。比如:我们讨论一部电影,讨论的是电影角色(“数据元素”),而不是电影角色的眼睛,鼻子,嘴巴(“数据项”)去分析。
数据对象:是性质相同的数据元素的集合,是数据的子集。
总结:一开始我觉得数据元素特别像一个类或者Model,然后数据项就相当于类或Model的属性(是不是很像?!!),但是数据对象的概念我就理解不了了,难道是具有相同属性的不同类,然后这么几个类组成一个对象?(我想没人会这么干吧...)。
这里我们需要明确一点就是,我们的关注点是数据,而不是程序,所以上面的想法完全就是错误的,正确的着眼应该是从数据出发。这样就很好理解了。比如数据库中的一张成绩表,这张表就是数据对象,表中的每一条记录就是一个数据元素,而表的每一个列就是数据项。因为数据元素是数据的基本单元,所以我们可以说一条记录是一个数据;且数据对象也是数据的子集,那么我们也可以说这张表是一个数据;当然我们更可以说表中的一个成绩也是一个数据。所以数据的概念是最大的。
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。 在计算机中,数据元素并不是孤立、杂乱无序的,而是具有内在联系的数据集合。数据集合之间存在的一种或多种特定关系,也就是数据的组织形式。
数据之间的结构又分为逻辑结构和物理结构(也有叫存储结构)。
逻辑结构:指数据对象中数据元素之间的相互关系。数据元素的逻辑表示。
物理结构:指数据的逻辑结构在计算机中的存储形式。数据元素的物理存储。
逻辑结构分为以下四种:
1.集合结构:数据元素除了同属于一个集合外,相互之间没有其他关系。就相当于数学中的集合。
2.线性结构:数据元素之间是一对一的关系。众多数据元素排成一条线。
3.树形结构:数据元素之间存在一种一对多的关系。
4.图形结构:数据元素是多对多的关系。
物理结构分为以下两种:
1.顺序存储结构:把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。这种存储结构其实很简单,就是排队占位。大家都按顺序排好,每个人占一小段空间,大家谁也别插队。结合语言,就相当于数组。当你告诉计算机你要建立一个9个整型数据的数组时,计算机就在内存中(堆)找了片空地,按照一个整型所占位置的大小乘以9,开辟一段连续的空间,于是第一个数组数据就放在第一个位置,第二个数据放在第二个,这样一次排列。数组名是第一个位置的指针。
2.链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。数据元素的存储关系不能反映其逻辑关系,因此需要用一个指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置。指针:存放数据元素的地址,通过指针就可以找到数据元素在内存中的位置。
书中有两句话:“数据的存储结构应正确反映数据元素之间的逻辑关系,这才是最为关键的”,“数据元素的存储关系并不能反映其逻辑关系”,有点难以理解。我个人的一些理解是:本身数据元素的存储关系是不能反映其逻辑关系的,就是两者是两回事,但是我们如果做数据结构的优化,就需要正确选用逻辑关系和存储关系,让存储关系可以反映出逻辑关系。简而言之就是,如何存储数据元素之间的逻辑关系,是实现物理结构的重点和难点(要先确定优秀或者合适的逻辑结构,再选用合适的物理结构)。(ps.有点迷糊,继续看下去,希望可以自己想明白,也希望有大神可以帮我解答一下这个困惑。)
逻辑结构是面向问题的,而物理结构就是面向计算机的,其基本的目标就是将数据及其逻辑关系存储在计算机的内存中。
数据类型:指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
数据类型是按照值的不同进行区分的,比如java中整数和小数可以区分成整型和浮点型;又根据整型的大小可以分为short,int,long,浮点型又可以分为float和double。
至于为什么会有数据类型的概念呢,就跟我们租房子一样,如果一个人住就可以租个单间,当然可以租两室一厅或几室几厅,但可能会造成浪费。在计算机中,因为计算机的内存是有限的,为了不造成不必要的浪费,就定义几种数据类型,规定好长度和分类。
java中分为四类八种基本类型,分别是:
*整型:byte,short,int,long;
*浮点型:float,double;
*逻辑型:boolean;
*字符型:char;
抽象数据类型:我们对已有的数据类型进行抽象,就有了抽象数据类型。指一个数学模型及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。
抽象:指取出事物具有的普遍性的本质。它是抽出问题的特征而忽略非本质的细节,是对具体事物的一个概括。抽象是一种思考问题的方式,它隐藏了复杂的细节,只保留实现目标所必需的信息。
不同的计算机有不同的硬件系统,这就要求程序语言最终通过编译器来转换成底层语言。可事实上高级程序语言并不会管你整型在底层语言是怎么定义的,怎么进行加减乘除运算的,也不想知道CPU为了运算进行了多少次开关操作;同时不同的高级程序语言之间对于整型的实现方法可能也不一样,但由于其定义的数学特性相同,在计算机变成看来,它们都是相同的。所以所谓的整型其实是抽象数据类型。也因此,“抽象”的意义在于数据类型的数学抽象特性。
抽象数据类型不仅仅指那些已经定义并实现的数据类型,还可以是计算机编程者在设计软件程序时自己定义的数据类型。比如OC中CGSize,CGPoint这些几何数据类型。
根据抽象数据类型的定义,它还包括定义在该模型上的一组操作。事实上,抽象数据类型体现了程序设计中的问题分解、抽象和信息隐藏的特性。把实际生活中的问题分解为多个规模小且容易处理的问题,然后建立一个计算机能处理的数据模型,并把每个功能模块的实现细节作为一个独立的单元,从而是具体实现过程隐藏起来。
总结:个人感觉抽象数据类型,很像java中的抽象类的概念,也是将一个事物的特性和相同的动作抽取出来,并不需要关心具体的实现。
啊,伸个懒腰,感觉做笔记比看书还累(...),文章中加引用的是书中的定义,其他都是个人对于书中内容进行的一些思考的记录和总结,也不知道对不对,哈哈。
尽量保证每个星期更新一篇,内容的话基本都是对于书单上三本书的学习记录(笔记),也有可能是吐槽文...
对了,刚在电梯看到物业贴的登革热提醒,希望同在杭州的小伙伴注意身体,祝大家长命百岁,身体健康,哈哈。欢迎大家留言讨论,共同进步。
Better Late Than Never!
努力是为了当机会来临时不会错失机会。
共勉!