在o(1)中访问数组的第n个索引

时间:2017-02-24 14:05:16

标签: java python arrays

一个非常基本的问题,我们如何直接以O(1)成本访问第n个索引?当我们初始化一个数组时,是否有一些数据结构用于保存每个索引的地址(以后以o(1)成本访问)?否则它必须从数组的开头到第n个索引遍历。在o(1)中访问数组元素的原因是什么?

2 个答案:

答案 0 :(得分:0)

可以在O(1)中索引数组,因为访问所需数据的计算只需一步即可完成。

如何完成这一操作非常简单,比如你创建一个包含10个整数的数组。

int[] intArray = new int[10];

这里发生的是你要求的内存块大到足以包含10个整数(在Java中它们是32位,所以10 * 4字节长)。

当内存被保留时,该块开头的内存地址被返回并放入intArray变量(包含地址/引用其他东西的变量称为指针)。

为了使这更容易理解,您可以将存储器(RAM)作为一长串单字节块列表,每个块都有一个地址。

Data:    [ 00000000 ] [ 11111111 ] [ 00001111 ]
Address:      7             8            9

当您使用索引访问数组的一部分时,发生的事情是该索引用于计算您想要的块的内存地址。

e.g。使用上面的例子

char[] charArray = new char[3]; // This returns memory address 7

charArray[1] = 'b'; // Here the memory address is calcuated with the formula
                 // startAddress + index * Size Per Element

在这种情况下,startAddress是charArray中的值,index是数字1,每个元素的大小是单个char(1 Byte)的大小,因此它给我们的内存地址为8。

答案 1 :(得分:-1)

正如@Nullman在评论中所说的那样,至少在引用Python时,{(1)}是在O(1)中访问的。

来源:https://wiki.python.org/moin/TimeComplexity