【数据结构】重新面对数据结构
对于课堂上的《数据结构》,我会怀疑学校的教育方式;对于桌面上的三本《数据结构》,我会质疑作者到底有没有站在平民百姓的角度去写这些书;对于网上的一些《数据结构》教学视频,我开始质疑自己是否一个合格的学习者,又或许是自己没有找到适合自己的教材吧。数据结构是计算机基础中的战斗机,这是众所周知的,包括一个计算机初学者也知道这回事。但对于一点计算机经验都没有的小白来说,知道的永远只是个概念,因为老师可能教的只是硬生生的教材文字。我在想,如果一个工作多年的程序员看这些书都觉得吃力,一个懵懂的初学者面对这样的数据结构需要有多大的勇气。暂且不提基础教材那满山遍野的代码,开门见山就来一堆有专家理论,确实给人一种看不下去的欲望。我真怀疑那么多的程序员当中,真正能读懂和理解数据结构的有多少个。在一个不重视基础的年代,楼房再高,能否经得起考验还是个未知数。所以房地产商能做的除了努力买房子之外,还得祈祷没有“天灾”的光顾。我想现在买再多的学习书籍也弥补不了我学习数据结构受过伤害的恐惧心灵,现在只能依靠个人的学习思路来逐步去摸索和重新理解了。学习新的知识,还是结合自身熟悉的领域开始做适当的引导,例如以身边所熟悉的事物为例来引导新知识的概念和定义。
那到底什么是数据结构?
在这里我先抛开专业的解释,先从词义上来对“数据结构”进行理解。数据结构可以看作一个名词,但为了便于自己对概念的理解,我尝试把该名词进行拆分,那就是数据和结构。从拆分中的词类来看,结构可以看作是名词而数据可以看作是副词。那我再进一步去理解什么是结构。从互联网中得知,结构的意思是组成整体的各部分的搭配和安排。这个相对比较好理解,比如电脑是一个整体,一台完整的电脑是由它的各个部分如CPU、内存、硬盘等组件搭配和安排而成的。不难看出,如果把副词“数据”和名词“结构”再搭配在一起解释,那么“数据结构”的意思就是组成数据的各个部分的搭配和安排。电脑的种类我知道有台式电脑和笔记本电脑等,那么相对抽象的数据又有什么种类?还是从身边的所熟悉的事物开始,例如在电脑上看到的字符、图形、图像甚至包括音乐等等都是数据。有点计算机常识的都知道,数据最底层的逻辑表现形式是0和1,而物理形式可以通过电路的脉冲信号来表示逻辑形式的0和1进行数据传输,跟间谍类电影中通过敲打墙体产生的声音来当作数据的传送介质差不多道理。这些都是相对底层的知识,先了解了解。现在再来看看数据结构的专业解释,“数据结构是计算机存储、组织数据的方式”。结合上文提到的数据结构词义就比较好理解什么是数据结构了。
数据结构有哪些形式?换个说法,数据有哪些存储或组织方式?
想当年大学期间《数据结构》没挂科的可都知道,数据结构有集合、线性结构、树形结构和图状结构(网状结构)四种基本类型。“基本”意味在许多的数据存储或组织场景中普遍存在。好比电脑的CPU和内存的是搭配是电脑的基本组织形式,当然可以按照自己的组织形式DIY符合自己的电脑。数据同样如此,我们都可以各自按照自己的组织方式搭配自己所需的数据,例如我们可以利用编程语言来定义表示人的“数据结构”,例如在某个场景中需要定义人有口、耳、眼、鼻等属性,也存在要定义人有姓名、性别、年龄属性的数据结构。这些数据结之所以不能纳入基本数据结构类型,是因为这些数据结构都是根据不同场景的不同定义,相对于那四种基本类型,通用性还是相对较低。既然使用率那么高,那肯定得学习一下啊。
上文也提到,数据的组织和存储其实有逻辑结构和物理结构,物理结构涉及的就是计算机相对底层的硬件层面了,这不是我学习的重点。现在主要学习的还是逻辑结构上的知识。而刚才提到的那四种基本数据结构类型都是从逻辑上区分的。而这四种基本类型的数据结构中又被分为线性结构和非线性结构两大派。感觉越说越乱,直接来一张从互联网上抠来的图文总结吧。
接下来结合个类型的特征解释可能会更清晰一点:
线性结构特征
特征1:集合中必存在唯一的一个"第一个元素";
特征2:集合中必存在唯一的一个"最后的元素";
特征3:除最后元素之外,其它数据元素均有唯一的"后继";
特征4:除第一元素之外,其它数据元素均有唯一的"前驱"。
非线性结构特征
逻辑特征是一个结点元素可能对应多个直接前驱和多个后驱。
集合结构
解释:该结构的数据元素间的关系是“属于同一个集合”,别无其他关系。
特征1:集合中的数据成员是无序的,如果{1,3},{3,1}都表示同一集合;
特征2:每个数据成员在集合中不能重复,仅且只出现一次,如{1,3,1}则不能称之为集合。
线性结构
解释:该结构的数据元素之间存在着一对一的关系。
树型结构
解释:该结构的数据元素之间存在着一对多的关系。
图形结构
解释:该结构的数据元素之间存在着多对多的关系,也称网状结构。
如果有过编程经验的人可能会看出,这个集合的解释跟编程里集合的概念还多少有点诧异,不加以区分还是很用户被误导,毕竟在编程中的集合概念是一个大概念,而且编程中的集合数据会存在逻辑关系可能。其实上图还有一个令人困惑的地方,图文中各类型的层次关系体现不出集合、线性结构、树形、图形这四种基本数据结构类型。感觉一维数组、队列、栈、树、图、多维数组才属通一层次的类型,而集合、线性、非线性才是大类。当然,我的这些疑问都只是分类归纳的概念疑问,实际上的数据组织方式还是以上那几种常用的。况且时代会一直发展,也不排除明天就颠覆以上分类的说法。为了消除自己对数据结构分类的疑问,我从互联网继续发现了一张比较符合当下价值观的一张基本数据结构归纳图:
知识是无限的,重要的是掌握知识的不变量,其它的都是形式而已。