就时空复杂度而言,哪一个更好?

时间:2019-02-17 13:34:34

标签: java if-statement time-complexity big-o

就时空复杂度而言,哪个更好?

if (!(N % 2 == 0) || N % 2 == 0 && (N >= 6 && N <= 20)) {
  System.out.println("Weird");
} 
if ( N % 2 == 0 && (N >= 2 && N <= 5 || N > 20)) {
  System.out.println("Not Weird");
}

// OR

if (!(N % 2 == 0)) {
  System.out.println("Weird");
} else {
  if (N >= 2 && N <= 5) {
    System.out.println("Not Weird");
  }  if (N >= 6 && N <= 20) {
        System.out.println("Weird");
  }  if (N > 20) {
        System.out.println("Not Weird");
  }
}       

我正在尝试查看在Java中创建if语句的最佳方法是使简单但直接的if语句(例如下面的语句(但有点混乱)或顶部的“整洁”语句)变得简单。每个小细节都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

这些是相同的。

只有在有循环的情况下Big-O才起作用,它们都在恒定的时间O(1)中运行。

通常,避免嵌套。我个人更喜欢第一种选择。但实际上根本没有区别,尤其是由于短路:

如果在您的第​​一个示例中!(N % 2 == 0)true,则||将“短路”,这意味着由于找到了真相,因此不会评估其右半部分。这与第二个示例中的if语句相同。 &&运算符也是如此-如果遇到单个false值,他们就会“短路”,因为他们永远都无法以这种方式求真。

因此,从本质上讲,选择一个您喜欢的/逻辑上更具可读性/更连贯的

答案 1 :(得分:0)

如前所述,两种情况的时空复杂度相同。这里的重要因素是理解代码的复杂性。这取决于具体情况下的个人判断。

我不确定我更喜欢哪个,因为我不了解奇怪的算法,而我的偏好取决于这两种表述对于有见识的读者有多“显而易见”-我假设接触此代码的人都知道它的含义意味着N很奇怪。

但是在第二种情况下,我希望比较少。如果一个子句处理N <= 5,则下一个替代方法不需要确保N> = 6。

因此(用伪代码)

else if (N <= 1) {
   // no decision according to original code
} else if (N <= 5) {
   print not weird   
} else if (N <= 20) {
   print weird
} else {
   print not weird
}

是N还是怪异?然后,首先要求使用else以避免重复计算,其次,您是要忽略零和负整数吗? (我从我的观点出发,我提出的布局清楚地表明我们在这种情况下不做任何事情,并且我为阐明清楚性而争论-预期的读者可能不得不怀疑这种明显的遗漏)

还有,我在捡东西的时候

(!(N % 2 == 0))
通过将

编写为更清晰

(N % 2 != 0)