我之前曾尝试在What is the difference between an array and a list?中提出这个问题,但在得出结论性答案(more about that)之前我的问题已经结束。
我试图理解计算机科学中“阵列”一词的真正含义。我试图找到一个答案,没有根据本网站的精神进行讨论。我所要求的是语言不可知,但您可以利用您对使用过的各种语言中的数组所做的知识。
思考这个问题的方法:
有可能没有一个关于数组是什么的精确定义,如果是这种情况,那么是否有任何标准或接近标准的假设或数组是什么?至少有共同的领域吗?也许有几个定义,如果是这种情况,我正在寻找每个定义中最精确的。
语言示例:
(如果我错了,请纠正我。)
$eg = array('a', 'b', 'c')
而你unset($eg[1])
仍然使用'c'
检索$eg[2]
,那么现在只有$eg[1]
未定义。 (您可以调用array_values()
重新索引数组。您还可以混合使用字符串和整数键。在这个阶段怀疑C数组是这里唯一真正的数组,严格来说,数组是一个数组,它必须具有我在第一个要点中提到的所有特征。如果是这种情况那么 - 再次这些是怀疑我想要确认或拒绝 - JS和Ruby中的数组实际上是向量,而PHP数组可能是某种表格。
最后说明:我已经制作了这个社区维基,所以如果需要编辑几次答案来代替评论,请继续这样做。这里有共识。
答案 0 :(得分:5)
阵列|ərā|
名词
1 令人印象深刻的展示或特定类型的事物的范围:有关于该主题的大量文献 | 一系列令人眼花缭乱的选择。
2 有序安排,特别是
3 诗意/文艺精致或漂亮的衣服:他穿着精美的衣服。 动词
答案 1 :(得分:5)
实际上有一个很好的问题隐藏在那里,一个非常好的问题,它带来了我长期以来的语言。
而且情况正在恶化,而不是更好。
好的:有一些低调且广泛不受尊重的Fortran说得对,我最喜欢的语言如Ruby仍然出错:它们对函数调用,数组和属性使用不同的语法。究竟有多抽象? fortran function(1)
具有与array(1)
相同的语法,因此您可以在不更改程序的情况下将其中一个更改为另一个。 (我知道,不是为了作业,而在Fortran的情况下,这可能是愚蠢的打卡字符集的意外,而不是任何故意。)
关键是,我真的不确定x.y
,x[y]
和x(y)
应该有不同的语法。将特定抽象附加到特定语法有什么好处?为从事重构转换的IDE程序员创造更多工作?
说了这么多,很容易定义array
。在它的第一个普通形式中,它是通过数字偏移和使用特定于语言的语法访问的内存中的连续元素序列。在较高的普通形式中,它是对象的属性,它响应典型数字消息。
答案 2 :(得分:3)
如果忽略编程语言如何模拟数组和列表,并忽略抽象的实现细节(以及随之而来的性能特征),那么数组和列表的概念就难以区分。
如果您引入实现细节(仍然独立于编程语言),您可以比较链接列表,数组列表,常规数组,稀疏数组等数据结构。但是,您不再需要比较数组和列表本身。
我看到它的方式,你只能谈论编程语言环境中数组和列表之间的区别。当然,您正在讨论该语言支持的数组和列表 。你不能概括为任何其他语言。
简而言之,我认为这个问题是基于一个错误的前提,并没有有用的答案。
编辑:回应奥利的评论:
我并不是说使用“array”和“list”这两个词是没用的。我所说的是,除了特定编程语言的上下文之外,单词不能也不能有精确而明确的定义。虽然你希望这两个词具有不同的含义,但事实并非如此。只需看一下实际使用单词的方式。此外,试图在世界上强加一套新的定义注定要失败。
我对实现的观点是,当我们比较和对比数组和列表的不同实现时,我们就是这么做的。我不是说这不是一件有用的事情。我所说的是,当我们比较和对比各种实现时,我们不应该把我们称之为数组或列表或其他任何东西。相反,我们应该使用我们可以达成一致的条款......或者根本不使用条款。
对我来说,“数组”的意思是“可能有效索引的事物的有序集合”,“列表”意味着“可以有效索引的有序事物的有序集合”。但是有一些数组和列表的例子与趋势背道而驰;例如一方面是PHP数组,另一方面是Java ArrayLists。因此,如果我想要准确...在语言无关的背景下,我不得不谈论“类C数组”或“链表”或其他一些术语,这些术语清楚地说明了我真正意味着什么数据结构。如果我想清楚的话,术语“数组”和“列表”是没有用的。
答案 3 :(得分:3)
来自FOLDOC:
阵列
1.< programming >一组相同类型的数据项 以其指数(或“下标”)来区分。数字 数组可以具有的维度取决于语言,但是 通常无限制。
数组是一种aggregate数据类型。单身 普通变量(“scalar”)可以视为a 零维数组。一维阵列也是已知的 作为“vector”。
对数组元素的引用类似于 A [i,j,k]其中A是数组名称,i,j和k是 指数。 C语言的特殊之处在于每个索引都是 写在单独的括号中,例如A [i] [j] [k]的。这表达了 事实上,在C中,N维数组实际上是a 向量,其每个元素是N-1维数组。
数组的元素通常是连续存储的。 关于最左边或最右边的索引的语言不同 变化最快,即每行是否存储 连续或每列(对于2D数组)。
数组适用于存储必须访问的数据 以不可预测的顺序,与lists相反 顺序访问时最好。数组索引是 integers,通常为natural numbers,而后是associative array architecture由字符串标识。
2.< processor array >一个array processor,不要混淆 一个associative array。
另请注意,在某些语言中,当他们说“数组”时,他们实际上是指“programming”:
关联数组
<的 array 的> (或“哈希”,“地图”,“字典”)indices integers不仅仅是awk,而是可能的Perl 任意字串。hash coding及其后代(例如{{3}})具有关联性 使用{{3}}实现的数组更快 抬头。
答案 4 :(得分:3)
数组是由整数索引的数据项的有序集合。不可能确定更多。投票给出这个答案你相信这是这个问题的唯一合理结果。
答案 5 :(得分:2)
数组:
(1)将数组与迭代器或生成器等区分开来。 (2)区分数组和集合。 (3)将数组与诸如元组之类的东西区分开来,你得到一个int和一个字符串。 (4)将数组与其他类型的列表区分开来。也许并非总是如此,但程序员的期望是随机访问是恒定的时间。 (5)和(6)就是否认其他要求。
答案 6 :(得分:1)
我认为 real 数组会在连续内存中存储值。其他任何东西只被称为数组,因为它可以像数组一样使用,但它们并不是真的(PHP中的“数组”肯定不是实际的数组(非关联))。向量等是数组的扩展,增加了额外的功能。
答案 7 :(得分:0)
数组是一个容器,它所拥有的对象除了顺序之外没有任何关系;对象被抽象地存储在连续的空间中(高级别,当然低级别也可以连续),因此您可以通过插槽[x,y,z ...]访问它们。 例如,对于每个数组[2,3,5,7,1],您可以使用slot [2](在某些语言中使用slot [3])获得5个。
对于一个列表,一个容器,它所拥有的每个对象(井,每个对象持有者,如插槽或节点)都有指向“指向”其他对象的指针是主要的关系;一般来说,高或低水平的空间不是连续的,但可以是连续的;因此不建议按插槽[x,y,z ...]进行访问。 例如,每| -2-3-5-7-1- |,你需要从第一个对象到第三个对象进行旅行才能获得5个。