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

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


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 语句,例如下面的(但有点混乱)或顶部的“整洁”语句。每一个小细节都将不胜感激。


繁华开满天机
浏览 92回答 2
2回答

哔哔one

这些是相同的。Big-O 只有在你有循环的情况下才会发挥作用,它们都以恒定的时间运行O(1)。通常,避免嵌套。我个人更喜欢第一种选择。但是真的一点区别都没有,尤其是短路的原因:如果!(N % 2 == 0)是true在您的第一个示例中,||则将“短路”,这意味着因为它找到了一个真理,它不会评估它的右半部分。这与第二个示例中的 if 语句相同。运算符也是如此&&- 如果遇到单个值,它们会“短路”&nbsp;false,因为它们永远无法以这种方式评估为真。所以,本质上,选择你喜欢的/更具可读性/逻辑上更连贯的。

波斯汪

如前所述,两种情况的空间/时间复杂度相同。这里的重要因素是理解代码的复杂性。这归结为在特定情况下的个人判断。我不确定我更喜欢哪个,因为我不了解怪异的算法,而且我的偏好取决于这两种表述对有见识的读者有多“明显”——我假设任何接触此代码的人都知道它对 N 意味着什么奇怪。但在第二种情况下,我更喜欢更少的比较。如果一个子句处理 N <= 5,则下一个替代方案不需要确保 N >= 6。因此(在伪代码中)else if (N <= 1) {&nbsp; &nbsp;// no decision according to original code} else if (N <= 5) {&nbsp; &nbsp;print not weird&nbsp; &nbsp;} else if (N <= 20) {&nbsp; &nbsp;print weird} else {&nbsp; &nbsp;print not weird}N是奇怪的还是不奇怪的?那么,第一,else要求避免重复计算,第二,你的意思是省略对零和负整数的考虑吗?(我提出这个问题的观点是,我提出的布局清楚地表明我们不会为这种情况做任何事情,并且我正在为说明的清晰性而争论——目标读者可能不得不怀疑这种明显的遗漏)另外,当我在吹毛求疵的时候(!(N % 2 == 0))通过将其写为(N % 2 != 0)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java