白话数据结构与算法04:数据结构分类(逻辑、物理、线性、非线性、树、图、顺序、链式等)

微信关注公众号:程序员成长软技能  。日拱一卒,功不唐捐!

前面文件介绍了数据结构与算法、两者间的关系,然后介绍了时间复杂度、空间复杂度、大O表示及其估算方法。接下来几篇文章介绍下数据结构相关知识。

什么是数据结构

前面说到数据结构是存放数据的“容器”(书柜或者箱子),以及存放数据的逻辑(先按首字母排序,还是分类类别排序)。容器是物理概念,对应的是数据的物理存储。存放逻辑,也就是数据的组织方式,是数据间的逻辑关系。

数据结构的逻辑分类

数据的组织方式(即数据间的关系)被称为数据的逻辑结构 。逻辑结构是人观察数据的视角。一般的,按照数据的逻辑关系,数据结构被分为 线性结构 和 非线性结构 两大类。

线性结构

线性结构指的是数据之间存在着“一对一”的线性关系,是一组数据的有序集合。线性结构有且仅有一个开始结点和一个结束结点,并且每个结点最多只有一个前驱和一个后继。类比如现实生活中的排队。

线性结构常见的有:数组、队列、链表和栈等。

非线性结构

非线性结构指的是数据间存在着一对多的关系,一个结点可能有多个前驱和后继。如果一个结点至多只有一个前驱且可以有多个后继,这种结构就是树形结构。类比如公司的组织结构。
如果对结点的前驱和后继的个数都不作限制,这种结构就是图形结构。类比如社交网络的朋友关系。

非线性结构包括:广义表,树,图等

数据结构的物理分类

数据的物理结构又称为存储结构,是数据面向计算机存储的视角,是计算机存储数据的方式,是数据的逻辑结构在计算机中的存储映像。一般的,有两种不同的映像方法:顺序映像和非顺序映像,对应两种不同的存储结构分别是顺序存储结构和链式存储结构。

计算机的存储

这里我们不关心计算机存储的其他知识,只需明白”计算机可以通过一串存储地址来获取存储在这个地址上的数据“即可。那么什么是存储地址呢?
相信大家都住过酒店,一般的酒店会给每个房间分配一个门牌号,并且大多门牌号是顺序增加。住客在酒店人员的安排下,可以临时占有一间房间。住客也可能会因为某些原因,被酒店要求去其他指定的房间或者离开酒店。
计算机的存储就类似酒店,只不过房间里住的不是住客,而是数据。相应地,这些房间的门牌号就被称作存储地址。如果某房间有什么特殊事情发生,酒店人员根据房间号就会知道里边住的是哪个客人。

顺序存储结构

顺序存储指的是借助数据元素在存储中的相对位置来表示数据元素之间的逻辑关系,即在存储中,逻辑上相邻的结点他们的物理位置也相邻。所以在顺序存储结构中,一组数据要占据一段连续的存储,这就要求存储中有这么一段没有存放数据的、连续的存储空间。并且存放数据时候,数据的顺序与物理位置顺序一致。
比如排队,根据排队者所站位置就知道的他的名次,并且如果想知道第六个是谁,直接看位置即可。如果小张要在第三个位置插队,就要把原来第三个位置以及其后的所有位置的人都向后移动。

也就是说,顺序存储结构有个显著的优点,比较方便查询,另外,也不需要为表达数据间的逻辑关系而增加额外的存储空间。但也有插入、删除操作需要大量移动数据,需要预留存储空间等缺点。

链式存储结构

链式存储方式对逻辑上相邻的结点不要求在存储的物理位置上也相邻,结点间的逻辑关系是由附加的”指针“来表示的,所以存储上,一个结点包含两部分内容,一部分是当前结点的数据内容,一部分是当前结点下一个结点的存储地址(指针)。

还以排队举例的话,链式存储结构存储空间上不必是连续的,这点类似银行抽号排队,大家拿到号后不必在窗口前排队,而是散坐在大厅中。不同的是,大家手中的号记录的是自己后一位在哪坐着。此时,如果想查找第三个人是谁,就需要先问第一个人,你的后边是谁,然后根据他所记录的位置找到第二个,然后问第二个人,你的后边是谁,根据第二个人所记录的位置才可以找到第三个人。如果此时小张需要插队到第三名,只需要将小张结点中的位置信息改为原来第三结点的位置,然后将原第二节点的位置信息修改为小张的位置即可。

也就是说,链式存储结构有方便删除、插入的有点,但也有查找不方便的缺点。