簡體   English   中英

哪個在空間/時間復雜度方面更好?

[英]Which one is better in terms of space/time complexity?

在空間/時間復雜度方面,哪個更好?

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 語句,例如下面的語句(但有點混亂)或頂部的“整潔”語句。 每一個小細節都將不勝感激。

這些是相同的。

Big-O 僅在您有循環時才起作用,它們都在恆定時間O(1)

通常,避免嵌套。 我個人更喜歡第一個選項。 但是真的完全沒有區別,尤其是因為短路:

如果!(N % 2 == 0)在您的第一個示例中為true|| 將“短路”,意思是因為它找到了一個真理,它不會評估它的右半部分。 這與第二個示例中的 if 語句相同。 &&運算符也是如此 - 如果遇到單個false值,它們會“短路”,因為它們永遠無法以這種方式評估為真。

因此,本質上,選擇您更喜歡/更具可讀性/在邏輯上更連貫的

如前所述,兩種情況的空間/時間復雜度相同。 這里的重要因素是理解代碼的復雜性。 這歸結為在特定情況下的個人判斷。

我不確定我更喜歡哪個,因為我不理解奇怪的算法,我的偏好取決於任何一種公式對知情讀者來說有多“明顯”——我假設任何接觸過這段代碼的人都知道這對 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM