假设我有一个数组:
int[] array = new int[10];
什么是运行时:
int len = array.length;
我认为这将是一个固定的时间操作,但今天在采访中,采访者告诉我这将是O(n)
,因为需要计算元素的数量。
另外,如果我有这样的循环:
for (int i = array.length - 1; i >=0; i--) {
something with array[i];
}
这是否需要额外的n
操作才能到达数组的末尾以启动循环?面试官来自C背景,所以也许他们错误地认为Java是如何运作的,但我不想在采访中推动它。
答案 0 :(得分:9)
array.length
是O(1)并且循环总体上是O(n)(假设“某事物”是恒定时间)。
c有什么不同?
C的不同之处在于,根据数组的分配方式,您可以在O(1)
时间内查找其大小,或者根本不查找。 “完全没有”,我的意思是你必须自己跟踪尺寸。
(就个人而言,如果那是采访者的能力,我会对去那里工作有所保留。)
答案 1 :(得分:0)
这是解释array.length实现的另一个SO线程:
How is length implemented in Java Arrays?
调用length属性是一个O(1)操作,因为它实际上不计算数组,在创建数组时设置该字段。
另一方面,你的循环是O(n)操作。
答案 2 :(得分:0)
这是所有JAVA实现中的常量操作,因为JVM必须存储此字段以检查索引(如果索引无效,则必须抛出IndexOutOfBoundsException)。
在本地变量中缓存数组长度可能是一个好主意,因为JVM堆栈访问速度更快但这种改进非常小,通常循环体执行会超重此优化。