随机访问数组的时间复杂度

时间:2015-09-26 12:37:24

标签: arrays algorithm time-complexity turing-machines

在分析算法的时间复杂度时,我们通常认为数组的随机访问时间是一个常数(数组的大小n不是常数),但为什么呢?

考虑图灵机模型,其中数组存储在磁带中,以访问阵列的特定元素,其磁头必须移动到该位置,这需要O(n)时间。或者是否有任何其他方法来存储图灵机的数组,以便随机访问只需要一个恒定的时间?

4 个答案:

答案 0 :(得分:2)

戈登put it quite excellently

  

计算机不是图灵机。

“真正的”典型通用机器上的阵列不存储在“无限长”线性存储器中,而是存储在RAM中,随机存取存储器。从技术上讲,(并且坦率地简化了很多),你只需通过内存地址了解它就可以从RAM中获取任何地址。因此,访问任何地址都需要相同的时间。

现在,对于数组,您可以通过获取第一个元素的地址并添加n倍于单个元素的大小来直接计算第n个元素的地址。

请记住:图灵机是如何证明和理解某些事物的概念,而并不反映事情实际完成的现实。复杂性计算也是如此:当然,实际上对向量中任何元素的访问并不总是花费完全相同的时间,因为计算机科学人员需要做出的有关算法的有趣信息的假设并不能总是完全代表每个可以运行给定算法的物理机器 - 真正的现代计算机都有缓存和预取内存控制器,这样访问你“刚”访问过的内存比获取任何内存要快得多。

答案 1 :(得分:0)

对算法的分析不考虑由于内存模型(cpu寄存器,RAM和外部存储器)引起的开销。

原因很简单,它会使分析变得非常通用。然后,分析将取决于您使用的硬件类型。这会使分析复杂化,对通用目的无用。

答案 2 :(得分:0)

数组访问是常量时间,因为数组元素是连续存储的。与链表访问相对照。在链表中,每个节点都有到下一个节点的地址。这会强制CPU转到所有n-1个节点以到达第n个节点。但对于数组,您直接通过<img src="*" style="height:*>知道地址,因此可以在恒定时间内访问该元素。 这里的假设是数据存储在随机访问存储器中。

对于图灵机,数据存储在磁带上。而磁带是一种线性访问设备。 Wikipedia article大致相同:

  

虽然他们可以表达任意计算,但他们极简主义   设计使它们在实践中不适合计算:实际   计算机基于不同的设计,与图灵机不同,   使用随机存取存储器。

答案 3 :(得分:0)

在一个数组中,所有元素都存储在一个连续的内存位置。因此,为了访问任何元素,元素的地址被计算为与数组的基地址的偏移量,并且需要一个乘法来计算应该的内容。被添加到基地址以获取元素的内存地址。 因此,首先计算该数据类型的元素的大小,然后将其与元素的索引相乘以获得要添加到基址的值。 由于此过程需要一次乘法和一次加法,因此可以在恒定时间内访问数组元素。