为什么在恒定时间(O(1))中访问数组中的任何单个元素?

时间:2014-04-16 08:15:59

标签: arrays algorithm time-complexity

根据Wikipedia,访问数组中的任何单个元素需要恒定的时间,因为只需要执行一个操作来定位它。

对我来说,幕后发生的事情可能看起来像这样:

a)线性搜索(例如,我想访问元素5.我在索引0开始搜索,如果它不等于5,我转到索引1等) 这是O(n) - 其中n是数组的长度

b)如果数组存储为B树,则会得到O(log n)

我认为没有其他方法。

有人可以在O(1)中解释为什么以及如何做到这一点?

5 个答案:

答案 0 :(得分:22)

数组从特定的内存地址start开始。每个元素占用相同数量的字节element_size。数组元素从起始地址开始一个接一个地位于存储器中。因此,您可以使用i计算元素start + i * element_size的内存地址。此计算与数组大小无关,因此O(1)

答案 1 :(得分:6)

理论上,数组的元素具有相同的已知大小,并且它们位于内存的连续部分中,因此如果要访问任何元素,则数组的开头位于A内存地址像这样计算它的地址:

A + item_size*index所以这是一个恒定的时间操作。

答案 2 :(得分:3)

访问单个元素并非找到值为x的元素。

访问元素i意味着将元素放在数组的第i个位置。

这是在O(1)中完成的,因为它非常简单(数学计算的常数),其中元素位于索引,数组的开头和每个元素的大小。

RAM内存为访问RAM中的每个地址提供了一个恒定的时间(或者更确切地说,是有限的时间),并且因为找到地址是O(1),并且检索其中的元素也是O(1 ),它总共给你O(1)

查找值为x的元素是否实际上是Omega(n)问题,除非有关于数组的更多信息(例如,已排序)。

答案 3 :(得分:1)

通常将数组组织为连续的内存块,其中每个位置都可以通过索引计算来访问。对于任意大小的数组,此索引计算不能在恒定时间内完成,但由于可寻址空间的原因,所涉及的数字受机器字大小的限制,因此假设恒定时间是合理的。

答案 4 :(得分:1)

如果你有一系列的Int。每个int在java中都是32位。如果你在java中有10个整数,那就意味着你分配了320位的内存。然后电脑知道

0 - 索引在内存中,例如 - 39200

最后一个索引是内存39200 +数组总内存= 39200 + 320 = 39520

那么如果你想访问索引3.那么它是39200 + 32 * 3 = 39296.

这完全取决于您在数组中存储的对象占用的内存量。只记得数组占用整块内存。