列表(抽象数据类型)

列表(抽象数据类型)
维基百科,自由的百科全书
这篇文章是关于顺序数据结构。对于随机访问数据结构,请参阅数组数据类型。
在计算机科学中,列表或序列是一种抽象数据类型,表示可数数量的有序值,其中相同的值可能会出现多次。列表的实例是有限序列的数学概念的计算机表示; 列表的(潜在地)无限类型是流。[1]:§3.5列表是容器的基本示例,因为它们包含其他值。如果相同的值多次出现,则每次出现都被认为是不同的项目。

一个单链表结构,实现一个带3个整数元素的列表。
名称列表还用于几个可用于实现抽象列表(尤其是链接列表)的具体数据结构。

许多编程语言都提供对列表数据类型的支持,并且对列表和列表操作具有特殊的语法和语义。通常可以通过在括号 ‘()’,括号 ‘[]’,大括号 ‘{}’或尖括号等一对分隔符内用逗号,分号或空格分隔的顺序书写项目来构造列表’<>’。有些语言可能允许列表类型像数组类型一样被索引或切片,在这种情况下,数据类型更准确地描述为一个数组。在面向对象的编程语言,列表通常作为通用“列表”类的子类的实例提供,并通过单独的迭代器遍历。列表数据类型通常使用数组数据结构或某种类型的链表来实现,但其他数据结构可能更适合于某些应用程序。在一些情况下,比如在Lisp编程中,术语列表可能特指链接列表而不是数组。

在类型理论和函数式编程中,抽象表通常由两个操作来归纳定义:nil产生空列表,cons在列表的开头添加一个项目。[2]

内容 [ 隐藏 ]
1 操作
2 实施
3 编程语言支持
4 应用程序
5 抽象的定义
5.1 列表monad
6 参考
7 另见
操作[ 编辑]
列表数据结构的实现可以提供以下一些操作:

一个创建空列表的构造函数 ;
用于测试列表是否为空的操作;
将实体预先添加到列表的操作
将实体附加到列表的操作
用于确定列表的第一组件(或“头”)的操作
一个操作,用于引用由第一个列表(除了列表的尾部)以外的所有列表组成的列表。
实现[ 编辑]
列表通常作为链表(单链或双链)或数组(通常是可变长度或动态数组)实现。

实现列表的标准方式,源于编程语言Lisp,是让列表中的每个元素都包含它的值和一个指示列表中下一个元素位置的指针。这会导致链表或树,这取决于列表是否嵌套了子列表。一些较老的Lisp实现(例如Symbolics 3600 的Lisp实现)也支持具有特殊内部表示(用户不可见)的“压缩列表”(使用CDR编码)。列表可以使用迭代或递归操作。前者通常是命令式编程语言的首选而后者是功能语言的规范。

列表可以实现为具有索引 - 值对的自平衡二叉搜索树,提供对任何元素(例如所有居于边缘的内部节点和存储最右边孩子索引的内部节点的同等时间访问,用于指导搜索) ,取对数列表的大小,但只要没有太大的变化,就可以提供随机访问的错觉,也可以在对数时间内进行交换,前缀和附加操作。[3]

编程语言支持[ 编辑]
某些语言不提供列表数据结构,但提供使用关联数组或某种表来模拟列表。例如,Lua提供了表格。尽管Lua存储了内部具有数组索引的列表,但它们仍然显示为字典。[4]

在Lisp中,列表是基本的数据类型,可以代表程序代码和数据。在大多数方言中,前三个素数的列表可以写成(list 2 3 5)。在Lisp的几种方言中,包括Scheme,一个列表是一个对的集合,由一个值和一个指向下一个对(或空值)的指针组成,形成一个单独的链表。[5]

应用程序[ 编辑]
顾名思义,列表可以用来存储元素列表。但是,与传统数组不同,列表可以扩展和缩小,并且可以动态存储在内存中。

在计算中,列表比集合更容易实现。数学意义上的有限集合可以被实现为具有额外限制的列表; 也就是说,重复的元素是不允许的,顺序也是不相关的。对列表进行排序可以加速确定给定项目是否已经在集合中,但是为了确保顺序,需要更多时间将新条目添加到列表中。然而,在有效的实现中,集合是使用自平衡二叉搜索树或散列表而不是列表来实现的。

列表还构成了其他抽象数据类型的基础,包括队列,堆栈及其变体。

抽象定义[ 编辑]
具有某种类型E(单形列表)元素的抽象列表类型L由以下函数定义:

零:()→ L
缺点:E × L → L
第一:L → E
休息:L → L
与公理

第一(cons(e,l))= e
其余(cons(e,l))= 1
对于任何元素e和任何列表l。这是隐含的

cons(e,l)≠ 1
cons(e,l)≠ e
如果e 1 = e 2且l 1 = l 2,则cons(e 1,l 1)= cons(e 2,l 2)
请注意,第一个(nil())和rest(nil())没有定义。

这些公理相当于抽象堆栈数据类型的公理。

在类型理论中,上面的定义更简单地被认为是一个按照构造者定义的归纳类型:零和缺点。在代数方面,这可以表示为变换1 + E × L → L。第一和休息,然后由得到的图案匹配上的缺点的构造,并分别处理零的情况。

参考[ 编辑]
跳起来 ^ Abelson,Harold; Sussman,Gerald Jay(1996)。计算机程序的结构和解释。MIT出版社。
跳起来 ^ Reingold,爱德华; Nievergelt,Jurg; Narsingh,Deo(1977)。组合算法:理论与实践。恩格尔伍德悬崖,新泽西州:普伦蒂斯霍尔。第38-41页。ISBN 0-13-152447-X。
跳起来 ^ 格兰维尔的Barnett; 德尔汤加,卢卡(2008年)。“数据结构和算法” (PDF)。mta.ca 。检索2014 年11月12日。
跳起来 ^ Lerusalimschy,罗伯托(2003年12月)。在Lua编程(第一版)(第一版)。Lua.org。ISBN 8590379817 。检索2014 年11月12日。
跳起来 ^ 斯蒂尔,盖(1990)。Common Lisp(第二版)。数字出版社。第29-31页。ISBN 1-55558-041-6。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值