前言
前面两篇文章,关于线性表的,基本上都已经讲述完了,但是这只是对狭义线性表,这种狭义的线性表,主要就体现在对应的线性表数据结构中的元素存在一对一的相互关系,但是我们前面几篇文章讲的都是有着非常明显直白的一对一相互关系的,但是在实际的划分中,我们对线性表有着更为广泛的划分。
而本篇文章,主要的就是讲述如果在广泛的意义上去了解线性表,那么还有哪些数据结构,可以算的上线性表。
正文
数据结构,本身来说,是没有所谓精准的含义去描述分类的,但是我们为什么总是会去将这些数据结构分类呢?其目的很简单,将这些性质更为接近的数据结构算作一个类,并且将这个类型的性质抽象出来,让大家更加容易的去理解这些数据结构的性质。
但是,也万万不可死板的觉得这个数据结构,就一定是这个类型。换一句话说,这个世界可有真理?
所以线性表也是如此,如果只是狭隘的去套关于线性表的定义,我相信关于线性表的大部分数据结构,我这边已经梳理的差不多了,但是我们还是要讲一下,关于线性表的一个推广。
什么是线性表的推广?从名字上来看,线性表的推广,也就是对线性表这个概念的一个延长,一个扩大,也就是说,这个数据结构也许从存储结构上看,确实不是线性结构,但是我们从不同的角度来分析这个数据结构,会发现,其实这个数据结构,在这个角度上来认知,其实是可以当一个线性结构来看的。
那么,本文主要讲述的线性结构有两个,如下:
- 多维数组
- 广义表
接下来,让我们正式的开始去了解这两种数据结构,去明白为什么可以将这两种数据结构称之为线性表。
1.多维数组
在了解多维数组之前,我们要先知道一下一维数组。
在我写的文章《从头开始学习->java数据结构(三):一般线性表》中,其实我已经讲述了数组结构,这种结构是个典型的顺序存储结构,而且也有着典型的一对一的关系,因此我们可以断定这必然是一个线性表,但是这里我所说的数组,是一维数组。
那么什么是多维数组呢?先看图:
我们可以看到,一维数组A的第一个数据元素A0,存储的是一个一维数组B,这种形式的存储结构,叫做二维数组。那如果,一个一维数组里面的数据元素,存储的是一个二维数组,那么这个数组我们称之为三维数组,这样的数组形式,我们就称之为多维数组。
也就是说,一个n维的数组,可以看做是一个数据元素存储(n-1)维数组的一个一维数组。
但是我们都知道,一维数组,都是线性表,所以从这个角度上来看,多维数组,也可以属于线性表。所以我们会将多维数组看作是线性表的一种扩展,一种推广。
2. 广义表
什么是广义表?
广义表是一种非连续性的数据结构,是线性表的一种推广。
在广义表中放松了对表元素的原子限制,容许每一个数据元素有自己的结构。
如果仅仅是这样,或许我们会有一些疑惑,广义表的定义仿佛和多维数组没有什么区别,多维数组也是如此,多维数组的每一个数据元素也可以是一个数组,这和广义表的含义不就一样了吗?
但是要注意的是,多维数组的数据元素,要么都是不可再分的数据元素,要么都是数组,绝不可能是两者都有。而广义表,就恰恰可以这样。
可以举例说明一下,如下:
A = (), //空的广义表
B = (f), //广义表B中只有数据元素f
C = (g,(h,i,j,k)), //广义表C中的有两个元素,原子g和子表(g,i,j,k)
D = (A,B,C) = ((),(f),(g(h,i,j,k))), //广义表D中有三个子表A,B,C
E = (m,E) = (m,(m,(m,(m,....)))) //广义表 E 中有两个元素,原子 a 和它本身。这是一个递归广义表
从这些例子可以看出,广义表是既可以存储不可再分的数据元素,也可以存储广义表,而且两者可以同时存在。
总结
我们都知道,一般线性表是零个或者多个数据元素的有限序列。但是这个数据元素,都是不可切分的单体。但是如果将这个限制放开,那么多维数组和广义表,也可以算是线性表了,但是严格来讲,这两种数据结构不是线性结构,也因此,我们将这两种数据结构称之为线性表的推广。