Raj*_*l D 3 java execution time-complexity
将最可能的条件放在if,else-if或else条件中是否有任何区别
例如:
int[] a = {2,4,6,9,10,0,30,0,31,66}
int firstCase = 0, secondCase = 0, thirdCase = 0;
for( int i=0;i<10;i++ ){
int m = a[i] % 5;
if(m < 3) {
firstCase++;
} else if(m == 3) {
secondCase++;
} else {
thirdCase++;
}
}
Run Code Online (Sandbox Code Playgroud)
执行时间与输入的区别是什么
int[] a = {3,6,8,7,0,0,0,0,0,0}
Run Code Online (Sandbox Code Playgroud)
在if,else-if或else条件中是否存在任何不同的最大可能真实条件
实际上,Java的答案是"它取决于".
您可以看到,当您运行Java代码时,JVM会在收集统计信息时使用解释器启动.可以记录的统计之一是最常采用分支指令中的哪些路径.然后,JIT编译器可以使用这些统计信息来影响代码重新排序,这不会改变编译代码的语义.
因此,如果您要使用两个不同的数据集(即"大多数为零"和"大多数非零")执行代码,则JIT编译器可能会以不同方式编译代码.
它是否能够实际进行此优化取决于它是否能够确定重新排序是否有效.例如,它可以推断出被测试的条件是互斥的吗?
那么这会如何影响复杂性呢?好吧......让我们为简化的例子做总结,假设JIT编译器没有做任何"智能"的事情.并假设我们不只是处理长度为10的数组(这使得复杂性的讨论没有实际意义).
考虑一下:
对于每个零,循环执行一次测试和一次增量 - 比如说2次操作.
对于每个非零元素,循环执行两个测试和一个增量 - 比如说3个操作.
因此,当所有零对3*N操作都是非零时,对于N个元素大约是2*N个操作.但两者都是O(N)......所以Big O的复杂性不会受到影响.
(好吧,我留下了一些东西......但你得到了图片.其中一个案例会更快,但复杂性不受影响.)
这比你被告知的要多一些。
'if' 与 'else':如果一个条件和它的逆条件的可能性不同,你应该在 'else' 块中处理更有可能的条件,而不是在 'if' 块中。'if' 块需要一个不执行的条件跳转和一个围绕 'else' 块的最终分支;'else' 块需要一个被采用的条件分支,而根本没有最终分支。
“if”与“else if”与“else”:显然您应该处理“if”块中最常见的情况,以避免第二次测试。与 (1) 相同的考虑决定了最终的“else if”和最终的“else”之间更常见的情况应该在最终的“else”块中处理。
话虽如此,除非测试非常重要,或者所有这些块的内容都非常简单,否则其中任何一个都不太可能产生明显的差异。
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |