【发布时间】:2016-01-12 21:21:06
【问题描述】:
嗯,我正在做一个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是对称的
但是这段代码运行很慢:在 leetcode 上 80ms 但是如果我将 if 语句的顺序更改为:
if Issymmetric(A.left, B.right) and Issymmetric(A.right,B.left) and A.val == B.val:
return True
这段代码具有相同的逻辑,但只需要 52ms,我有点假设应该在彻底处理整个左/右子树之前比较根值(通常这更有效,它可能会节省大量的递归调用)
TL;DR 这给我的印象是python以相反的顺序评估短路和,所以我对我的本地环境做了一点测试:
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() 函数 我做了一些进一步的测试,我认为 80ms 只是 leetcode 的一个小故障,谢谢
【问题讨论】:
-
为什么你会认为它是反过来的?如果 == 需要 28 毫秒,而 ISsymmetric 分别需要 52 毫秒,那么您得到的结果对于从左到右的短路评估是有意义的。
-
输入是什么样的?如果树的根节点非常相似并且仅在树的末端有所不同,那么这就是您的代码会变慢的原因。这就像问为什么当列表的最后一个元素不同时,检查列表是否相等的方法很慢。
-
它做了一些测试,80ms 在 leetcode 上看起来像是一次性的……现在恢复正常了,我应该删除这篇文章吗?
标签: python recursion short-circuiting