为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁华开满天机 2022-06-23 10:27:38
就空间/时间复杂度而言,哪个更好?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");}// ORif (!(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 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

这些是相同的。

Big-O 只有在你有循环的情况下才会发挥作用,它们都以恒定的时间运行O(1)

通常,避免嵌套。我个人更喜欢第一种选择。但是真的一点区别都没有,尤其是短路的原因:

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

所以,本质上,选择你喜欢的/更具可读性/逻辑上更连贯的。


查看完整回答
反对 回复 2022-06-23
?
波斯汪

TA贡献1811条经验 获得超4个赞

如前所述,两种情况的空间/时间复杂度相同。这里的重要因素是理解代码的复杂性。这归结为在特定情况下的个人判断。


我不确定我更喜欢哪个,因为我不了解怪异的算法,而且我的偏好取决于这两种表述对有见识的读者有多“明显”——我假设任何接触此代码的人都知道它对 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)


查看完整回答
反对 回复 2022-06-23
  • 2 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信