【问题标题】:cost of retrieving an element from array in java [duplicate]从java中的数组中检索元素的成本[重复]
【发布时间】:2014-05-26 05:53:05
【问题描述】:

我有一个非常基本的问题。 在java中(或者我认为对任何类似的语言都有效),从数组中检索元素的时间是多少。由于数组的大小及其元素类型在编译时是已知的或在运行时计算的,我相信检索应该在恒定时间内发生,O(1)。例如,

int[] arr = new int[10];

虽然我不确定数组的内部存储器表示,但我认为像 arr[3] 这样的操作应该在从数组起始地址、元素类型的大小(此处为 32)和传递的索引(此处为 3)计算地址后直接访问内存) 如下所示:

address of arr[3] = address of a[0] + 32 * 3.

感谢您的帮助。

【问题讨论】:

  • 如果内存服务,这实际上非常接近于 C/C++ 中数组访问的发生方式。我不确定 Java 在内部做了什么,但我相当肯定数组访问总是 O(1)
  • 你能给我指出一些这样说的链接吗?
  • 不确定这有多大帮助,但有this。我认为这是与语言无关的事情——您需要做的就是执行一些数学运算,将其添加到指针中,然后就可以找到索引了。
  • 在编译时不需要知道数组的大小。例如,编译器无法告诉您new int[(int) System.currentTimeMillis() / 1000] 的大小。
  • 同意@johncip,在java中,数组的至少大小不需要是编译时常量。不错的收获。尽管值是在运行时计算的并且内存分配是在运行时发生的,但从讨论到现在,访问时间似乎是恒定的。

标签: java arrays


【解决方案1】:

这是Memory vs Computation power的经典案例:

对于 Java:

只要数组大小足够小并存储在 JVM Heap 上,它就会是常数时间。

否则它将取决于您使用concurrency fork join/parallel programming 实现大型数据集等因素。

同样值得关注的是内存分配器将如何为相关语言工作,因为时间成本带来它in process 再次对象大小是重要因素。

【讨论】:

    【解决方案2】:

    就像 user3580294 说它应该是 O(1),因为你给了它你想要在数组中查看的确切位置,而不是迭代当然是 O(n)。

    【讨论】:

      【解决方案3】:

      是的,它的 O(1)。更准确地说是:O(k*1)) where k -- >some machine dependent constant

      【讨论】:

      • O(1) 不是已经暗示了机器特定的常量吗?
      • @user3580294 - 确实如此。我只是想指出这样一个事实,即对底层机器总会有一些依赖。
      • 那么(k * 1)不应该更合适吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 2014-08-25
      • 2010-10-13
      • 1970-01-01
      • 2017-08-08
      • 2012-05-13
      相关资源
      最近更新 更多