![](/img/trans.png)
[英]which of these methods to mirror a tree is better in terms of time and space-complexity
[英]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.