Nik*_*Nik 6 java optimization time-complexity data-structures
在Java中,我需要array1[index]
在代码中多次访问.
即使对于超大型阵列,我还能假设每个单一阵列访问需要恒定时间吗?
这在语言或底层架构之间有区别吗?
Ada*_*old 11
数组查找始终 是O(1)
.它不依赖于数组的大小.关于数组的基本思想是它包含具有固定大小的对象/引用,因此您可以只size * index
拥有要查找的对象的位置.
因此,它不像是一个LinkedList
(这是O(n)
也没有HashMap
被O(1)
摊销.
我认为大多数语言都是如此.一个例外可能是javascript,因此请确保检查您正在使用的语言的文档.
访问数组中的元素是常数时间(它只是计算地址偏移量)。此行为对于您列出的所有语言都是一致的。虽然不应该假设它适用于所有语言,但它适用于大多数语言。
在缓存未命中/命中、管道等方面存在一些复杂性,但基本上是恒定时间。
但对于 List 而言,情况并非如此。一些 List 实现为不同的操作提供不同的性能特征。
扩展复杂性:
问题是“大数组的访问速度会变慢吗”。正确答案是“是”。
就访问顺序而言,它将保持 O(1),但实际访问可能需要更长的时间。例如,如果数组的大小导致缓存未命中(因此数据需要从主内存获取到处理器的缓存)和/或内存分页问题(因此数据需要从磁盘获取),它会变得更慢,尽管那样是任何大型数据集的属性,而不是数组的属性。
在大多数情况下,这种差异并不值得担心。在您开始担心缓存未命中之类的事情之前,我们正在谈论相当重的优化。但是,正如这个问题所说明的那样,值得了解这些事情:
由于处理器工作方式的细节,代码上看似无关的细节(数组的预排序)从表面上看应该总是以相同的时间运行五倍。