假设我们有一个数组A,它的第一个元素是a,地址为adr。 当我们想要访问第n个元素时,在机器层面我们必须首先计算adr + n*a[size],然后访问该元素。
正如我们所见,第n个元素地址的计算取决于n,大n意味着更多的计算步骤
那么为什么说访问数组是常数时间呢?
我搜索为什么会这样,但我没有找到
是的,在某些处理器上,较大数字的乘法可能需要更长的时间,尽管现在我们讨论的是一些额外的周期,即使对于非常非常大的数字也是如此。换句话说,乘法确实可以很好地扩展。
即使使用移位和加法方法,我们也可以最大限度地提高乘法的复杂性,例如移位加法循环的 32 或 64 次迭代。
我们看到第n个元素地址的计算取决于n,大n意味着计算步骤更多
数组索引是使用以下类型完成的:
指向数组开头的基指针,程序和处理器将其视为无符号整数,其大小为处理器的地址宽度(例如,64 位或 32 位,具体取决于处理器)。
数组的索引,需要根据数组元素的大小进行缩放,该索引最终也限制为与上面的基指针相同的位宽。
我想指出的是,没有办法分配一个数组,数组索引计算将溢出固定位宽度。请求的内存超出处理器可以寻址的内存时,分配将失败。因此,这意味着所有访问有效内存的索引和指针算术操作都不会溢出,并且不需要在计算中检查溢出。 (除非使用比处理器的无符号位宽度更小的大小来完成索引操作,遗憾的是,这可能会因程序员的选择和/或语言默认值而发生。)
由于无法分配超出处理器寻址能力的数组,因此我们可以在索引计算中使用固定大小的算术。正因为如此,我们知道处理器可以在 O(1) 内完成此类索引。