数组访问不是恒定的

问题描述 投票:0回答:1

假设我们有一个数组A,它的第一个元素是a,地址为adr。 当我们想要访问第n个元素时,在机器层面我们必须首先计算adr + n*a[size],然后访问该元素。

正如我们所见,第n个元素地址的计算取决于n,大n意味着更多的计算步骤

那么为什么说访问数组是常数时间呢?

我搜索为什么会这样,但我没有找到

arrays time-complexity machine-code
1个回答
0
投票

是的,在某些处理器上,较大数字的乘法可能需要更长的时间,尽管现在我们讨论的是一些额外的周期,即使对于非常非常大的数字也是如此。换句话说,乘法确实可以很好地扩展。

即使使用移位和加法方法,我们也可以最大限度地提高乘法的复杂性,例如移位加法循环的 32 或 64 次迭代。


我们看到第n个元素地址的计算取决于n,大n意味着计算步骤更多

数组索引是使用以下类型完成的:

  • 指向数组开头的基指针,程序和处理器将其视为无符号整数,其大小为处理器的地址宽度(例如,64 位或 32 位,具体取决于处理器)。

  • 数组的索引,需要根据数组元素的大小进行缩放,该索引最终也限制为与上面的基指针相同的位宽。

我想指出的是,没有办法分配一个数组,数组索引计算将溢出固定位宽度。请求的内存超出处理器可以寻址的内存时,分配将失败。因此,这意味着所有访问有效内存的索引和指针算术操作都不会溢出,并且不需要在计算中检查溢出。 (除非使用比处理器的无符号位宽度更小的大小来完成索引操作,遗憾的是,这可能会因程序员的选择和/或语言默认值而发生。)

由于无法分配超出处理器寻址能力的数组,因此我们可以在索引计算中使用固定大小的算术。正因为如此,我们知道处理器可以在 O(1) 内完成此类索引。

© www.soinside.com 2019 - 2024. All rights reserved.