嗯,我正在做一個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毫秒只是對本文給出了一個小故障,由於
你爲什麼會認爲這是做反向?如果==需要28ms,並且ISsymmetric每次需要52ms,那麼您得到的結果對於從左到右的短路評估是有意義的。 – ergonaut
輸入是什麼樣的?如果樹的根節點非常相似,並且僅在樹的末端有所不同,那麼這就是爲什麼你的代碼會很慢。這就像問爲什麼一個方法檢查列表的平等是否很慢,因爲它們只有最後一個元素不同。 – Dunes
它做了一些測試,** 80ms **看起來像leetcode一次性的東西......現在已經恢復正常了,我應該刪除這篇文章嗎? – watashiSHUN