java – 数组的查找时间复杂度与存储方式的关系
作者:互联网
众所周知,索引对数组访问的时间复杂度为O(1).
Java的ArrayList文档由数组支持,它的get操作也是如此:
The size, isEmpty, get, set, iterator, and listIterator operations run in constant time.
通过在给定索引处获取元素的内存地址而不依赖于数组的大小(类似于start_address element_size * index)来完成查找.我的理解是数组的元素必须在内存中彼此相邻存储,以便这种查找机制成为可能.
但是,从this question开始,我知道Java中的数组不能保证它们的元素在内存中连续存储.如果是这样的话,怎么总是O(1)?
编辑:我很清楚ArrayList是如何工作的.我的观点是,如果JVM规范无法保证数组的连续存储,则其元素可能位于内存中的不同区域.尽管这种情况极不可能,但它会使上面提到的查找机制变得不可能,而JVM将有另一种方法来进行查找,这不应该是O(1).那时,它将违反此问题顶部所述的常识和ArrayList关于其获取操作的文档.
谢谢大家的回答.
编辑:最后,我认为这是一个特定于JVM的东西,但是大多数(如果不是全部的话)JVM坚持连续存储一个数组的元素,即使在没有保证的情况下,也可以使用上面的查找机制.它简单,高效且具有成本效益.
据我所知,将元素存储在整个地方然后必须采用不同的方法进行查找是愚蠢的.
解决方法:
据我所知,规范并不能保证数组会连续存储.我推测大多数JVM实现都会.在基本情况下,它很简单,可以强制执行:如果你不能扩展数组,因为其他内存占用了你需要的空间,那就把整个东西移到其他地方.
你的困惑源于对O(1)意义的误解. O(1)并不意味着在单个操作中执行功能(例如,start_address element_size * index).这意味着无论输入数据的大小如何 – 在这种情况下,阵列,都在恒定的时间内执行操作.对于未连续存储的数据,这是完全可以实现的.例如,您可以将索引映射到内存位置.
标签:java,arrays,time-complexity 来源: https://codeday.me/bug/20190828/1755407.html