数据结构实际是“结构数据”,如果把建房子的每种材料认为是数据,那么这些材料的数量和比例就是“数据的逻辑结构”了(房子的“结构”却非数据的逻辑结构)。也就是说这些材料不能随意的,需要符合一定的数量关系——逻辑关系——数据的逻辑结构。我们可以把数据元素抽象为一个点,把数据元素之间的逻辑关系抽象为点之间的连线,这样就得到数据结构的“图”。看下图中所有的数据元素(点)是不是构成一个数据结构?
上图中的数据元素没有通过连线(逻辑结构)连起来,它不是一个数据结构。这样我们就可以得到数据结构的判定标准:
(1)一个元素多于1的数据结构中,每一个数据元素都不是孤立的,它至少与另一个数据元素有逻辑关系。
(2)一个元素多于1的数据结构中,任一个数据元素根据逻辑关系可以到达其他所有的数据元素。也就是说,数据结构不是“数据黑箱”,它的每一个元素都可以从数据结构外部直接或间接的访问到。
我们往往认为一张单色图片中各部分的位置和大小构成图片的全部。其实不是的,因为即使大小和位置一样,我们也能把左右手区分开来。这种忽略了图片的颜色、大小和位置,剩下来的图就是拓扑图。
根据数据结构中元素的逻辑关系绘制出来的图,就是一个点线拓扑图,因此,我们可以根据点线拓扑图的不同来对数据结构进行分类。
我们都看过接力赛,运动员依次把接力棒交给下一个运动员。用点代表运动员,用连线代表交棒,可以得到下面一张拓扑图:
。这种一个接一个的拓扑关系,我们形象的给它一个名称叫“线性”。这种线性不是直线性,而是拓扑线性。同样一些数据结构中的数据元素也同样有这样的关系,我们把这种数据结构称为线性(逻辑)结构。
线性结构判定标准:
(1)数据结构中必存在唯一的一个“第一个元素”和唯一的一个“最后的元素”。
(2)当数据结构中的元素多于1时,假如去除“第一个元素”或“最后的元素”,数据结构还能保持上一性质不变。
简单地说,线性结构的数据元素就像接力赛中的运动员,“一接一”的关系。符合线性结构的数据结构包括一维数组、栈、队列、链表等,如下图所示。
它们都具有唯一开头和结尾元素;一维数组(一维数据元素组)通过下标、队列通过序号、栈通过入栈先后、链表通过前导或后续元素可以直接或间接访问集合中的所有元素;假如把头或尾元素去除,它们也能保持同样的线性结构;因此它们都是线性数据结构。
而非线性结构就是除了线性结构之外的其他结构,元素前后之间是一接多、多接一或多接多的关系。非线性结构相对于线性结构有一个最明显的区别:各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素存在联系。
根据非线性数据结构拓扑关系的不同,分为层次结构和群结构两大类。常见的非线性结构有二维数组、多维数组、广义表、树(二叉树)结构、图结构等,树结构和图结构如下图所示。
数据的逻辑结构是数据的逻辑关系本身,与怎样产生这种逻辑关系的方式和方法无关。那产生数据逻辑关系的方式和方法是什么呢?下一课继续讨论。
参考资料:
1、《Python算法图解》何韬编著 清华大学出版社