10

可能重复:
数组,有什么意义?

我之前尝试在数组和列表之间有什么区别?但是我的问题在得出结论性答案之前就已经结束了(更多关于那个)。

我试图理解计算机科学中“数组”这个词的真正含义。我正在尝试根据本网站的精神得出一个没有讨论的答案。我要问的是语言不可知论,但您可以利用您对数组在您使用的各种语言中的作用/作用的了解。

思考这个问题的方法:

  • 想象一下,您正在设计一种新的编程语言,并决定在其中实现数组;这意味着他们做什么?这些东西的属性和能力是什么。如果它取决于语言的类型,那又如何呢?
  • 是什么使数组成为数组?
  • 什么时候数组不是数组?例如,何时是列表、向量、表格、地图或集合?

数组是什么可能没有一个精确的定义,如果是这种情况,那么是否有任何标准或接近标准的假设或数组是什么?至少有公共区域吗?也许有几个定义,如果是这种情况,我正在寻找每个定义中最精确的。

语言示例:

(如果我对其中任何一个有误,请纠正我)。

  • C 数组是单一类型的连续内存块,可以使用指针算术遍历或在特定偏移点访问。他们有一个固定的大小。
  • JavaScript、Ruby 和 PHP 中的数组具有可变大小,可以存储任何类型的对象/标量,它们也可以增长或从中删除元素。
  • PHP 数组有两种类型:数值型和关联型。关联数组具有使用字符串键存储和检索的元素。数值数组具有使用整数存储和检索的元素。有趣的是,如果你有:$eg = array('a', 'b', 'c')并且你仍然用unset($eg[1])检索,只是现在是未定义的。(您可以调用以重新索引数组)。您还可以混合使用字符串和整数键。'c'$eg[2]$eg[1]array_values()

在这个阶段,有点怀疑 C 数组是这里唯一真正的数组,严格来说,一个数组要成为一个数组,它必须具有我在第一个要点中提到的所有特征。如果是这样的话——这些都是我希望确认或拒绝的怀疑——JS 和 Ruby 中的数组实际上是向量,而 PHP 数组可能是某种表。

最后说明:我已经创建了这个社区 wiki,所以如果需要对答案进行多次编辑以代替评论,请继续这样做。共识在这里是有序的。

4

8 回答 8

5

数组 |əˈrā|

名词

1某类事物的令人印象深刻的展示或范围:有大量关于该主题的文献| 令人眼花缭乱的选择

2有序的安排,特别是

  • 部队的安排。
    1. 数学:数量或符号在行和列中的排列;一个矩阵。
    2. 计算:一组有序的相关元素。
    3. 法律:指定陪审员名单。

3诗/文学的精致或美丽的衣服:他穿着精美的衣服。动词

  1. [反式。] (usu. be arrayed) 以特定的方式展示或安排(东西): 摆在桌子上的是自助餐 | 对他不利的部队。
  2. [反式。](usu. be arrayed in)给某人穿上(指定的衣服):他们穿着匈牙利民族服饰。
  3. [反式。] 法律专家(陪审团)。起源 中古英语(在 [preparedness] 和 [place in readiness] 的意义上):源自古法语 arei(名词),areer(动词),基于拉丁语 ad- 'toward' + 一个日耳曼语基础,意思是 'prepare'。</李>
于 2009-10-15T04:10:56.887 回答
5

它是或应该是关于抽象的

里面实际上隐藏了一个好问题,一个非常好的问题,它引发了我长期以来对语言的不满。

而且情况越来越糟,而不是更好。

好的:有一些低级和广泛不尊重的 Fortran 是正确的,而我最喜欢的语言(如 Ruby)仍然出错:它们对函数调用、数组和属性使用不同的语法。这到底有多抽象?在 fortranfunction(1)中具有与 相同的语法array(1),因此您可以在不更改程序的情况下将其中一个更改为另一个。(我知道,不是为了作业,在 Fortran 的情况下,这可能是愚蠢的穿孔卡片字符集的意外,而不是任何故意的。)

关键是,我真的不确定x.y,x[y]x(y)应该有不同的语法。将特定抽象附加到特定语法有什么好处?为致力于重构转换的 IDE 程序员创造更多工作?

说了这么多,定义很容易array。在它的第一个标准形式中,它是内存中的连续元素序列,通过数字偏移量和使用特定语言的语法进行访问。在更高的范式中,它是响应典型数字消息的对象的属性。

于 2009-10-15T04:11:15.887 回答
3

数组是按整数索引的数据项的有序集合。不可能确定更多。投票给这个答案,你认为这是这个问题唯一合理的结果。

于 2009-10-15T05:33:22.307 回答
3

来自FOLDOC

大批

1. <编程> 由索引(或“下标”)区分的相同类型数据项的集合。数组可以具有的维数取决于语言,但通常是无限的。

数组是一种聚合数据类型。单个普通变量(“标量”)可以被视为零维数组。一维数组也称为“向量”。

对数组元素的引用写成 A[i,j,k] 之类的东西,其中 A 是数组名称,i、j 和 k 是索引。C语言的特殊之处在于每个索引都写在单独的括号中,例如 A[i][j][k]。这表达了这样一个事实,在 C 中,N 维数组实际上是一个向量,其每个元素都是一个 N-1 维数组。

数组的元素通常是连续存储的。语言的不同在于最左边或最右边的索引是否变化最快,即每一行是连续存储还是每一列(对于二维数组)。

数组适用于存储必须以不可预测的顺序访问的数据,而列表则最好按顺序访问。数组索引是 整数,通常是自然数,而关联数组的元素由字符串标识。

2. <架构>处理器阵列,不要与阵列处理器混淆。

另请注意,在某些语言中,当他们说“数组”时,实际上是指“关联数组”:

关联数组

< programming >(或“hash”、“map”、“dictionary”)一个数组 ,其中索引不仅仅是整数,还可以是任意字符串。

awk及其后代(例如Perl)具有关联数组,这些数组使用散列编码实现,以便更快地查找。

于 2009-10-15T04:49:00.383 回答
3

如果您忽略编程语言如何建模数组和列表,并且忽略抽象的实现细节(以及随之而来的性能特征),那么数组和列表的概念是无法区分的。

如果您介绍实现细节(仍然独立于编程语言),您可以比较链表、数组列表、常规数组、稀疏数组等数据结构。但是,您不再比较数组和列表本身。

在我看来,您只能在编程语言的上下文中谈论数组和列表之间的区别。当然,您随后谈论的是该语言支持的数组和列表。你不能泛化到任何其他语言。

简而言之,我认为这个问题是基于一个错误的前提,并且没有有用的答案。

编辑:回应奥利的评论:

我并不是说使用“数组”和“列表”这两个词没有用。我要说的是这些词没有也不能有精确和不同的定义……除非在特定编程语言的上下文中。虽然您希望这两个词具有不同的含义,但事实并非如此。看看这些词的实际使用方式。此外,试图将一套新的定义强加给世界注定要失败。

我关于实现的观点是,当我们比较和对比数组和列表的不同实现时,我们就是这样做的。我并不是说这不是一件有用的事情。我要说的是,当我们比较和对比各种实现时,我们不应该完全纠结于我们是否称它们为数组或列表或其他什么。相反,我们应该使用我们可以同意的条款……或者根本不使用条款。

对我来说,“数组”的意思是“可以有效索引的事物的有序集合”,“列表”的意思是“可以有效索引的事物的有序集合”。但是有一些数组和列表的例子都与趋势背道而驰。例如,一方面是 PHP 数组,另一方面是 Java ArrayLists。因此,如果我想准确地说……在与语言无关的上下文中,我必须谈论“类 C 数组”或“链表”或其他一些术语,以明确我真正的意思是什么数据结构。如果我想清楚的话,术语“数组”和“列表”是没有用的。

于 2009-10-15T04:40:14.010 回答
2

数组:

  1. 是元素的有限集合
  2. 元素是有序的,这是它们唯一的结构
  3. 相同类型的元素
  4. 支持高效随机访问
  5. 不期望有效的插入
  6. 可能支持也可能不支持附加

(1) 将数组与迭代器或生成器等区别开来。(2) 区分数组和集合。(3) 将数组与获得 int 和 string 的元组之类的东西区分开来。(4) 将数组与其他类型的列表区分开来。也许这并不总是正确的,但程序员的期望是随机访问是恒定的时间。(5) 和 (6) 只是用来拒绝额外的要求。

于 2009-10-15T06:11:11.627 回答
1

我认为真正的数组将值存储在连续的内存中。其他任何东西都只称为数组,因为它可以像数组一样使用,但它们并不是真正的(PHP 中的“数组”肯定不是实际的数组(非关联))。向量等是数组的扩展,增加了额外的功能。

于 2009-10-15T05:40:49.583 回答
0

数组是一个容器,它所包含的对象除了顺序之外没有任何关系;对象抽象地存储在一个连续的空间中(高级,当然低级也可能是连续的),因此您可以通过 slot[x,y,z...] 访问它们。例如,对于每个数组 [2,3,5,7,1],您可以使用 slot[2](在某些语言中为 slot[3])获得 5。

对于列表,容器也是如此,它持有的每个对象(嗯,每个对象持有者,例如 slot 或 node)都有指示符“指向”其他对象,这是主要关系;一般来说,无论是高层还是低层,空间都是不连续的,但可能是连续的;所以不推荐通过 slot[x,y,z...] 访问。例如,根据 |-2-3-5-7-1-|,您需要从第一个对象到第三个对象进行一次旅行以获得 5。

于 2009-10-15T04:21:22.490 回答