根据Wikipedia,访问数组中的任何单个元素需要恒定的时间,因为只需要执行一个操作来定位它。
对我来说,幕后发生的事情可能看起来像这样:
a)线性搜索(例如,我想访问元素5.我在索引0开始搜索,如果它不等于5,我转到索引1等) 这是O(n) - 其中n是数组的长度
b)如果数组存储为B树,则会得到O(log n)
我认为没有其他方法。
有人可以在O(1)中解释为什么以及如何做到这一点?
答案 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.
这完全取决于您在数组中存储的对象占用的内存量。只记得数组占用整块内存。