2014-10-07 115 views
2

我在计算机科学课上学习数组和链表。我的教授说,数组不能添加或删除元素,所以我们使用链表。Ruby数组是什么数据结构?

我知道在Python,Ruby和JavaScript中的数组的实现都允许我修改所有我想要的数组长度。这些语言是否真的实现了链表或其他数据结构,并将其称为数组?

这是怎么回事?如果它不是一个真正的数组,他们为什么称它为一个?

+1

您可以查看所有这些数组实现的代码。你也应该警惕类似“让你修改数组长度”这样的陈述 - 仅仅因为你可以使一个数组变长,并不意味着当你这样做时不会产生内存拷贝。 – 2014-10-07 15:50:15

+0

在Ruby和Python等高级语言中,链表实际上没有用处,因为没有有效的方法来实现它们(至少不比内置数组类型更有效)。数组/链表比较你的教授大都适用于C. – Martijn 2014-10-07 18:12:27

回答

5

如果数组已满,则固定大小的数组不能具有添加到元素末尾的元素,但删除元素很好。这就是堆栈的工作原理。

内部Ruby数组被分配为固定大小的C风格数组,并且在添加元素时自动调整大小。作为一种优化,它们通常会重新调整大小,超出所需的范围,以避免在每次添加时重新分配。

链接列表是一种不同的数据结构,允许更灵活的插入和删除,但是遍历速度慢得多,不允许简单的随机访问,这对于数组结构非常重要。在源为Ruby阵列实施

+0

酷。我知道JS和Python也是C的衍生物。他们是否也使用C风格的数组? – 2014-10-07 17:24:44

+0

它们不是C的派生物,但标准的Ruby,Python和JavaScript V8核心是用C语言编写的。它们只是约定,它们在内部使用C风格的数组,但每种方法都有不同的方法来处理这些数据。 – tadman 2014-10-07 17:39:07

3

https://github.com/ruby/ruby/blob/trunk/array.c

快速一瞥,它是一个C阵列,只是一个存储器块。但是正如你在代码中看到的那样,它还提供了通过更新这块内存或者根据需要重新分配来添加和删除的功能,为您提供了修改Ruby数组的动态方便。

相关问题