为什么在数组O(1)中查找?

时间:2014-08-28 05:40:19

标签: ruby arrays big-o

我相信在除Ruby之外的某些语言中,数组查找是O(1),因为您知道数据的起始位置,并将索引乘以数组所持有的数据大小,然后访问该内存位置。

但是,在Ruby中,一个Array可以包含来自不同类的对象,那么它如何设法查找O(1)复杂度呢?

2 个答案:

答案 0 :(得分:6)

@Neil Slater说的更详细......

基本上有两种合理的方法来存储不同大小的异构对象数组:

  1. 将对象存储为单个或双重 - linked list,每个单独对象的存储空间前面都有指向前一个和/或后一个对象的指针。这种结构的优点是可以很容易地在任意点插入新对象而不会移动阵列的其余部分,但是巨大的缺点是通过它的位置查找对象通常是O(N),因为你有从列表的一端开始,逐节点地跳过它,直到你到达 n 第一个。

  2. 将一个常量大小的表或数组存储到各个对象。由于此查找表包含连续有序布局中的常量项,因此查找单个对象O(1)的地址;该表只是一个C风格的数组,其中查询只需要1到几个机器指令,即使在RISC CPU架构上也是如此。

  3. (存储单个对象的分配策略也很有趣且复杂,但与您的问题无关。)

    像Perl / Python / Ruby这样的动态语言非常所有选择#2 的通用列表/数组类型。换句话说,它们使查找比在列表中的随机位置插入对象更有效,这是许多应用程序的更好选择。

    我不熟悉Ruby的实现细节,但它们很可能类似于Python的list类型,其性能和设计在effbot.org详细解释。

答案 1 :(得分:4)

它的实现可能包含一个指向实际对象的内存地址数组。因此,它仍然可以在不循环遍历数组的情况下进行查找。