小编Luc*_*tti的帖子

数组的查找时间复杂度与存储方式

众所周知,通过索引访问数组的时间复杂度是 O(1)。

ArrayList由数组支持的 Java 的文档对其get操作也有相同的说法:

size、isEmpty、get、set、iterator 和 listIterator 操作在恒定时间内运行。

查找是通过获取给定索引处元素的内存地址来完成的,该地址与数组的大小无关(类似于start_address + element_size * index)。我的理解是数组的元素必须在内存中并排存储,这样查找机制才能成为可能。

但是,从这个问题,我了解到 Java 中的数组不能保证其元素连续存储在内存中。如果是这样,它怎么可能总是 O(1)?


编辑:我很清楚 a 是如何ArrayList工作的。我的观点是,如果 JVM 规范不保证数组的连续存储,则其元素可能位于内存中的不同区域。尽管这种情况不太可能发生,但它会使上面提到的查找机制变得不可能,并且 JVM 将有另一种方法来进行查找,不再是 O(1)。在这一点上,这既违反了这个问题顶部所述的常识,也违反了ArrayList关于其的文件get操作。

谢谢大家的回答。


编辑:最后,我认为这是一个特定于 JVM 的事情,但大多数(如果不是全部)JVM 仍然坚持数组元素的连续存储,即使没有保证,以便可以使用上面的查找机制。它简单、高效且具有成本效益。

据我所知,将元素存储在所有地方然后必须采用不同的方法进行查找是愚蠢的。

java arrays time-complexity

5
推荐指数
1
解决办法
3440
查看次数

标签 统计

arrays ×1

java ×1

time-complexity ×1