Java 将最可能的真实条件置于if、else if或else中有什么不同
在if、else if或else条件中放置最可能的条件是否有任何区别 例:Java 将最可能的真实条件置于if、else if或else中有什么不同,java,time-complexity,execution,Java,Time Complexity,Execution,在if、else if或else条件中放置最可能的条件是否有任何区别 例: 如果您只有一个if else,则没有区别,因为该条件将始终被评估,并且几乎总是正确还是错误都无关紧要。但是,如果在else部分中有if(else if),最好将最可能的真实条件放在第一个if中。因此,在大多数情况下,您不需要在else中计算条件,从而提高性能。如果If中的大多数条件为真,那么执行时间将更短。因为在第一个If条件中,只有满足了它 如果If-else中的大多数条件为真,那么执行时间将少于最后一个场景,而多于第
如果您只有一个
if else
,则没有区别,因为该条件将始终被评估,并且几乎总是正确还是错误都无关紧要。但是,如果在else
部分中有if
(else if
),最好将最可能的真实条件放在第一个if
中。因此,在大多数情况下,您不需要在else
中计算条件,从而提高性能。如果If中的大多数条件为真,那么执行时间将更短。因为在第一个If条件中,只有满足了它
如果If-else中的大多数条件为真,那么执行时间将少于最后一个场景,而多于第一个场景
如果else中的大多数条件为真,则执行时间将更长。因为它检查前两个条件。确实如此
如果。。。否则,如果…
按编码顺序进行检查。所以,如果您将最可能的条件放在这个条件检查队列的末尾,那么这样的代码会稍微慢一点
但这一切都取决于这些条件是如何建立的(它们有多复杂) 最可能的情况应该是if,然后是if-else等等 最好在第一级编写最常见的条件,以便在更短的时间内首先处理该条件是否为真
如果您将最频繁的条件放在中间(else..If)或最后(else),那么到达该条件语句将需要时间,因为它需要检查每个条件语句。这比您被告知的要多一些
那么这是如何影响复杂性的呢?好。。。假设JIT编译器不做任何“聪明”的事情,让我们为简化的示例求和。并且假设我们不仅仅处理长度为10的数组(这使得复杂性的讨论变得毫无意义) 考虑这一点:
- 对于每个零,循环执行一个测试和一个增量操作,例如2个操作
- 对于每个非零元素,循环执行两个测试和一个增量操作,例如3个操作
O(N)
。。。因此,大O复杂性不受影响
(好的,我遗漏了一些内容……但你明白了。其中一种情况会更快,但复杂性不会受到影响。)对于时间复杂性,你通常会计算最坏情况下的时间和介质。在最糟糕的时候,你显然会假设每次都会出现最复杂的路径。所以,为了回答你的问题,它不应该有什么区别。这是一个糟糕的例子,因为如果n为正(包括0),n%2将始终为0或1。感谢@Dici现在我已更正代码,我认为现在它的更正0是偶数(0%2==0)!数字只能是奇数或偶数,%2没有第三种情况。更好的例子是%3。然而,这仍然是一个糟糕的例子,因为这三种情况的概率都相同。我建议您进行编辑。@Dici-我建议您阅读JLS第15.17.3节。还有第三种情况。你的第一点引起了我的注意,但我不明白。最后一个分支叫什么?为什么它比条件跳转慢(如果我不理解的话)?@Dici条件分支加上无条件分支比条件分支慢。复杂性部分相关吗?如果他有一个从0到n-1的循环,那么他的复杂度就不一样了。然而,它与if/else if语句的顺序无关。@Dici-OP将问题标记为“时间复杂性”,因此对复杂性的讨论显然是相关的。这就是你争论的问题吗?
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++;
}
}
int[] a = {3,6,8,7,0,0,0,0,0,0}