2015-10-14 45 views
0

嗯,我正在做一個question on leetcode to verify if something is a symmetric tree和我有這一行代碼:我應該如何在短期內排列我的聲明?

if A.val == B.val and Issymmetric(A.left, B.right) and Issymmetric(A.right,B.left): 
    return True 

基本上如果A的根值相同B的根值和A的左子樹是對稱B的右子樹加上A的右子樹是對稱B的左子樹,然後我得出結論:A,B是對稱

但是這個代碼的運行速度非常慢:80ms的對本文給出了 但如果我改變if語句的順序:

if Issymmetric(A.left, B.right) and Issymmetric(A.right,B.left) and A.val == B.val: 
    return True 

這個代碼具有相同的邏輯,但只需要52ms,我認爲比較根值應該在我詳盡地處理整個左/右子樹之前完成(通常這是更有效的,它可以節省大量的遞歸調用的)

TL; DR 這給我的印象是,蟒蛇評估短路和以相反的順序,所以我做了一個小測試,在我的本地環境:

def f1(): 
    print 1 
    return True 
def f2(): 
    print 2 
    return True 
if f1() and f2(): 
    pass 
# but the output I got is 1,2... 

我很困惑,如果短路順序是從左到右,爲什麼我的代碼之間有巨大的性能差異?

我可以上傳我的整個IsSymmetric()函數,如果有必要 我做了一些進一步的測試,我認爲80毫秒只是對本文給出了一個小故障,由於

+1

你爲什麼會認爲這是做反向?如果==需要28ms,並且ISsymmetric每次需要52ms,那麼您得到的結果對於從左到右的短路評估是有意義的。 – ergonaut

+0

輸入是什麼樣的?如果樹的根節點非常相似,並且僅在樹的末端有所不同,那麼這就是爲什麼你的代碼會很慢。這就像問爲什麼一個方法檢查列表的平等是否很慢,因爲它們只有最後一個元素不同。 – Dunes

+0

它做了一些測試,** 80ms **看起來像leetcode一次性的東西......現在已經恢復正常了,我應該刪除這篇文章嗎? – watashiSHUN

回答

1

這是一個有趣的問題,進入一些微妙的領域。

當看一個條件,以及條件的速度,你需要看看它是如何區分它。即,它會立即給出「正確」的答案,或者如果您需要繼續查看其他條件。

根據多種因素,首先有一個緩慢但有區別的情況可能會更好。

考慮兩個功能:

def f1(c): 
    sleep(20) 
    return (c % 2) == 0 

def f2(c): 
    sleep(25) 
    return (c % 4) == 0 

f1()速度很快,但不是很挑剔,而f2()較慢,但更多的歧視。考慮兩個表達式f1(c) and f2(c)經文f2(c) and f1(c)c in 0..3

=== ===== ==== 
c exp1 exp2 
=== ===== ==== 
0 20+25 25+20 
1 20+0 25+0 
2 20+25 25+0 
3 20+0 25+0 
=== ===== ==== 
    130 120 

注意具有在(略)較小的總時間slow條件第一名的成績如何。

+0

有趣的是,確實遞歸函數更可能失敗,因爲它比較整個子樹而不是比較一個節點,我猜如果不一致(導致非對稱的節點)很深(接近葉子),這是有道理的...我提交了相同的代碼leetcode,它現在顯示52ms ....我想我永遠不會知道它的輸入或簡單地在他們的網站緩存問題 – watashiSHUN

0

的Python if報表將在第一次突破虛僞的標誌。即。

if a == True and b == True: 

將打破,如果a是假,只會評估b如果a爲True。所以,如果你有一系列的比較,就像你做的那樣,並且想要優化速度,那麼把你最常見的情況放在第一位。

+0

你是說我應該在左右子樹上做IsSymmetric(),然後做'A.val == B.val',但是我想即使左右子樹確實是對稱的,如果'A.val != B.val',那麼我們只是浪費遞歸,是我的邏輯錯誤? – watashiSHUN

+0

我在說的是,如果邏輯中最常見的'break'是'Issymmetric(A.left,B.right)',那麼應該在其餘部分之前。然而,只有在正確地分析代碼,確定結果,甚至關心性能優化之後,才能進行這種優化。 –

相關問題