【数据结构】抽象数据类型间的区别和联系(列表,线性表,链表,数组)

【数据结构】抽象数据类型间的区别和联系(列表,线性表,链表,数组)

备注

2020/3/17 星期二
听说大家已经都开始学习数据结构了,但是很多人都被各各种数据结构相关的名称搞的晕头转向,我专门查了大量资料来和大家一起聊聊各种数据结构的关系。

一、抽象数据类型ADT

抽象数据类型ADT(Abstract Data Type)是我们为了一类可能存在特定形式和行为的数据而构建的数学模型。ADT由值和其上的操作构成,对于ADT我们更关心的是它的定义和操作,而不会关心这个ADT具体是如何实现的。

二、线性结构

对于数据结构,我们通常可以分为线性结构和非线性结构。
线性结构是一种抽象数据类型,它的特点如下:
1.集合中必存在唯一的一个"第一个元素";
2.集合中必存在唯一的一个"最后的元素";
3.除最后元素之外,其它数据元素均有唯一的"后继";
4.除第一元素之外,其它数据元素均有唯一的"前驱"。
数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构。这是线性结构的特点也可以看做是它的定义,我们通常用它了判断一个数据结构是不是线性结构。

三、数组(一维)

有许多人认为数组是一种数据类型而不是数据结构,因为许多语言(c、java等)都内置了数组操作,不过也有些语言(如python)没有内置数组。实际上数组也是数据结构,是最简单的数据类型,而且由于它符合上述线性结构的特征,它也是一种线性结构。同时数组大多数时候被用做存储结构,数组是顺序存储结构,具有一次申请长期使用的特点。由于数据结构的定义比较模糊,所以有些人对此此存在争论,国内论坛各执一词,我最终选择了维基百科作为参考资料,英语好的朋友可以自己看一下。
数组关于数组我们一般不那么关心它的操作,因为大多数语言都为我们提供了应有的操作,而且是我们最常用的操作之一了,而没有提供数组的语言一般用不到数组或者有更好的数据类型可以使用,不需要我们自己实现数组的操作。

四、链表(linked list)

链表也是最简单常见的数据结构之一,同时它符合线性结构的特点它是典型的线性结构。与数组不同,链表的元素可以存在内存的任意位置,并且内存动态分配的,地址是不连续的,这可以提高内存的利用率。链表的种类较多,我就不列举了,在c语言中一般用指针加动态分配内存的方式实现,当然也可以用数组来模拟(并不是真正的链表)。我们也可以用链表来模拟数组(并不是真正的数组),从中我们可以发现,数据结构是可以互相模拟的,部分数据结构就是依靠一种或多种容易的实现的数据结构模拟而成,所以有些数据结构的实现方式不止一种(都是对的,各有优势)。对于链表,我们一般需要实现它的如下功能:
1.创建一个空链表
2.返回链表长度
3.添加元素
4.返回指定位次的元素
5查找某一元素(首次出现)
6.删除指定元素
与链表相关的维基百科我也放在下面了
链表

五、列表(list)

聊完链表,又聊列表有些人就会疑惑了:“这不是同一东西吗”。对此,我也非常疑惑,因为在不同人的口中,在不同计算机语言中list的含义并不相同,那么它到底是什么呢,查了许多国内论坛,我发现大家在用这些词的时候非常随意。可能指链表,也可能是一个数据类型或者模板,甚至是一个API接口。于是我又查了维基百科,维基百科说列表是种 ADT ,用来表示有序的值,这和线性结构很相似,甚至比线性结构的抽象级别还高些,其他的描述就很少了。原文如下
列表

六、线性表(linear list)

终于到了线性表,这个词比列表的使用频率高得多,甚至会出现在一些算法和数据结构的书籍中,可与列表相同并没有一个明确的定义,在国内各大论坛中线性表主要被当做 线性结构链表 这两个含义来使用。至于国外,维基百科并没有linear list这个词条,Google的结果也是有用做链表也有用做线性结构的。看来以后这个使用如此频繁的词要我们自己根据语义来区分了。


最后说一下,查找每个词的英文是为了判断是否是翻译不同造成的差别。多次引用维基百科是为了对比国内外对于同一个词的不同含义。同时,都选用维基百科作为参考可以减小不同论坛不同看法的影响,在词语的用法上并没有统一标准,只要自己习惯不产生歧义即可。


欢迎在评论区提出你宝贵的意见

猜你喜欢

转载自blog.csdn.net/l1447320229/article/details/104925364