数据结构到底怎么来的

感慨

感觉计算机中的好多问题,都是解决从哪儿取,放到哪儿的问题。每个解决问题的过程,最后都变成一个个从哪儿取,放到哪儿的过程。

一、数据结构通俗解释

首先我们来通过一个例子解释数据结构。我们从往书架上放书开始说起。

1.宿舍书桌放书

如果我们往宿舍的书架上放书,比如我们都不喜欢学习,那么大部分人放书的时候肯定不会考虑怎么放的问题,随手一放,哪里有空放哪里,在这里,我先规定一下我书架的格式,为了更好的和计算机内存拟合,更形象的说明问题,我的书架必须长下面这个样子。每个框里只能放一本书。那么这么小的书架,我们也不会一本书挨着一本书,中间可能有空格子。到时候想看那本书,眼睛扫一遍就到手了。这里我们根本不用动脑筋去想怎么放书和怎么取书。
数据结构到底怎么来的

2.图书馆某专栏书架放书

2019年,一个新星作家诞生了,名为Ted,他写了一部巨型连载小说,单身狗传记,2019年10月份已经写到第二十部了。这个时候我们去图书馆休闲区的小说货架上,找到了这二十本书,和我们的正常思维一样,图书馆的书应该是井然有序地,如下图所示,书架是这样放书的。
数据结构到底怎么来的
我们现在追到了第二十部了,我们就跑到前边找了两三本,心中自然发现了规律,这个架子一共有二十个框子,从左向右,我们从1开始给二十个架子编一个号,那么每个架子的编号对应的就是小说的编号,即 bookShelfNumber =0 + 1 * bookNumber,(哈希)虽然我们没有在想这些破烂公式,但是我们却是根据这个公式的逻辑到书架的末尾直接定位到了这本书。于是我们找到了我们需要的第20部小说。这里已经有了线性表的雏形,一对一的关系。我们利用这个模糊的模型,解决了如何放书,如何取书的问题。如果我们还像以前小书架那样乱七八糟插空放书,那么我们就得费点功夫找书了。

3.图书馆找本书

有一天,ted想要总结一下,从古至今,世界上的单身狗从出生到终结,报复社会的心理变化。ted需要去图书馆调研,找一些欧洲心理学家写过的有关单身狗心理变化的书。按照我们的逻辑,应该如下图所示,先找到图书馆心理学书籍室,在找到欧洲板块,再找到一个名叫泰迪朱丽叶的著名心理学家的专栏,再从其专栏的书架里找到了有关单身狗从始至终的心理变化系列书籍。
数据结构到底怎么来的
这其实就是一对多的关系,后面要说到的树形结构,非线性结构。如下图:
数据结构到底怎么来的
通过应用这种结构对书籍分类,我们解决了我们要如何放书,如何取书的问题。

4.示例总结

我们可看到以上三种放书的共同点,首先我们都需要进行放书和取书操作,根据三种不同的场景,我们采用了三种不同的方法,解决如何放书和如何取书的问题。这三种方法如果交换场景,都会变成很烂的解决方式,因此我们可以看出根据现实场景才能选用出合适的方法,没有最好的方法。只有适不适合。
这个例子和数据结构有什么关系呢。看完以下官方概念,我们再进行融合。

二、数据结构概念

通过例子的理解,我们再引用官方术语高度概括一下数据结构的相关概念,要想说清楚数据结构,首先我们说说数据相关得概念。

1.数据

是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。它不仅包括数值类型,还包括字符,图片等非数值类型。总结下来就是数据就是符号,用来承载信息的载体。数据具有以下两个特点,
(1)可以输入到计算机中
(2)能被计算机程序处理

2.数据元素

是组成数据的,有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录。看到记录这个词,有没有感到很熟悉,数据库中每一行就代表一条记录,对应着java中的一个对象。例子中,每本书就是一条记录,代表一本书。如果根据书架创建一个书籍数据表,book_info,那么每本书就是一个数据元素。
数据结构到底怎么来的

3.数据项

一个数据元素可以由若干个数据项组成。数据项是数据不可分割的最小单位。例如例子中,每本书,都有书名,出版时间,作者,出版社等等数据项。

4.数据对象

是性质相同的数据元素的集合,是数据的子集。即,数据元素具有相同数量和类型的数据项。例子中的代表书籍数据表的书架子就是数据对象,每个框子里存着一本书(数据元素–记录),每本书都有书名,作者,出版社等数据项。

5.数据结构

以上是数据的概念,接下来讲结构。对应到我们所举得例子,我们只讲了书架子是什么,往里面放的是什么,而没有讲怎么放,怎么取得问题。结构就是讲与怎么放怎么取相关的东西。
结构,即是关系。比如分子结构,就是组成分子的原子之间的排列方式。结构就是指各个组成部分相互搭配和排列的方式。数据元素之间不是独立的,是存在特定的关系的,我们将这些关系称为结构。数据结构就是,相互之间存在一种或多种特定关系的数据元素的集合。结合到例子里面:
第一种情况的放书,就是集合的关系,每本书(数据元素)之间没有多大关系,随便摆放。
第二种情况的放书,就是一种线性的结构,第一部后边是第二部,以此类推。
第三种情况的放书,就是一种树形结构,图书馆里有几个图书室,心理学的图书室里有不同作家的专栏,某个作家的专栏下有他写的书。
结合放书的情况,取书的时候就要按照放书的逻辑推断怎么去取。

三、数据结构的出现

了解了数据结构的概念,我们就可以更好地理解他出现的原因。是为了解决问题出现的。废话!
我们想要编写一个好的程序,必须分析待处理对象的特性以及各处理对象之间的关系,这里就需要引出数据结构理论。

1.逻辑结构

数据对象中数据元素之间的相互关系。我们可以说逻辑结构就是我们脑子里构思出来的结构,不实际存在,可以随便在脑子里改变。

集合结构

感觉集合结构中的数据元素,相似点不太多,挺像个垃圾桶,里面装的都是垃圾,干垃圾,湿垃圾,有害垃圾,可回收垃圾,虽然都不太一样,但放到垃圾桶里之后,都是垃圾,除了在座的各位都是垃圾之外,一个矿泉水瓶子和一个香蕉皮能有啥关系.(此处有点绝对,哈哈哈哈),例子中的第一种情况

线性结构

数据元素之间是一对一的关系.例子中的第二种情况

树形结构

数据元素之间是一对多的层次关系.例子中的第三种情况

图形结构

数据元素之间是多对多的关系.(此处我们就知道了为啥树形结构子树之间不可交叉,一旦交叉就成了图形结构了)

逻辑结构小结

我们用一个图形代表每一个数据元素,数据元素之间用连线来表示他们之间的关系,如果关系带有方向,我们就用箭头表示.

2.物理结构

指数据的逻辑结构在计算机中的存储形式.实实在在摆在我们眼前,不能靠思维去改变。
物理结构有的书中是存储结构,感觉存储结构更好理解一点,就是这些数据在计算机中是怎么摆放的.又因为数据元素之间存在逻辑关系,摆放的时候也要考虑逻辑关系.怎么样存储数据,能更好的表达数据元素之间的逻辑关系呢.

顺序存储结构

把数据元素存放在地址连续的存储单元中,由于地址是连续的,数据间的逻辑关系和物理关系就是一致的,逻辑上是:你过去是我,我过去是他,实际存储中也是:你过去是我,我过去是他,俩人是邻居.

链式存储结构

指把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的.我们需要一个指针来存放数据元素的地址,通过地址就可以找到相关联数据元素的位置.
如果严格按照顺序存储结构,我们要去掉其中一个,或者加入一个在中间,那么所有的数据元素都要移动位置填补空缺或增加一个空位,很麻烦.
链式结构便解决了这个问题,你可以随便放到存储空间任意的地方,只要编好号,我找你的时候,直接找到你的号码就可以了,不需要按顺序挤在一块.

四、抽象数据类型

1.数据类型

指一组性质相同的值的集合以及定义在此集合上的一些操作的总称.比如java中,String类型,封装了很多关于操作String类型的方法.对int类型进行运算操作,不需要太大的内存空间,而浮点型就需要很多内存来存储小数点.如果不分类进行操作,而进行同样的操作,对于int类型来说就有点浪费空间了,因此要对数据进行分类.
因为不同的计算机有不同的硬件系统,我们就需要编写多种底层语言来应对不同的计算机,但是高级语言并不需要关心这个计算机是什么系统的,因此就需要将对不同数据类型的操作进行封装抽象,见其名而知其意,不用关心底层实现.

2.抽象数据类型

是指一个数学模型及定义在该模型上的一组操作.抽象数据类型仅仅取决于数字模型的逻辑特性,与计算机内部如何实现存储无关.例如我们在java的API中见到的这些常用类,以及已经封装好的方法。
数据结构到底怎么来的