Golang Go语言中Leetcode求二叉树的最大深度问题,为什么这两种解法耗时会相差两倍?
Golang Go语言中Leetcode求二叉树的最大深度问题,为什么这两种解法耗时会相差两倍?
题目:给定一个二叉树,找出其最大深度。 语言:Golang
解法①:
// 16ms, beat 12.46%
func maxDepth(root *TreeNode) int {
if root == nil {
return 0
}
leftDepth := maxDepth(root.Left)
rightDepth := maxDepth(root.Right)
if leftDepth > rightDepth {
return leftDepth + 1
} else {
return rightDepth + 1
}
}
解法②:
// 8ms, beat 100%
func maxDepth(root *TreeNode) int {
if root != nil {
leftDepth := maxDepth(root.Left)
rightDepth := maxDepth(root.Right)
if leftDepth > rightDepth {
return 1+leftDepth
}
return 1+rightDepth
}
return 0
}
实际提交到 leetcode 上,前者耗时 16ms,后者耗时 8ms。
初学 Golang,请问这两段代码为什么执行时间会差两倍?
更多关于Golang Go语言中Leetcode求二叉树的最大深度问题,为什么这两种解法耗时会相差两倍?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
要先学会正确的性能测试方法
更多关于Golang Go语言中Leetcode求二叉树的最大深度问题,为什么这两种解法耗时会相差两倍?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
第一个解法,我这边运行是 8ms
做第一个题的时候,就发现同样的代码,执行结果耗时有差异,猜测可能是 gc,或者资源排队等问题。
leetcode 的隔离很差,波动大也很正常
感谢解答,还以为代码里有什么高深莫测的东西。
c
试一下 maxDepth(root.Left)>maxDepth(root.Right)? 1+maxDepth(root.Left): 1+maxDepth(root.Right);
你自己拿个秒表,掐两次,然后想想为什么其中一次会是另一次时间的两三倍,就知道原因了。
你自己同一个解法不同时间再提交,也可能差两倍
对的。
运行一万次的时间 / 10000 是每次运行的时间 [手动狗头]
leetcode 时间并不能作为性能测试的依据,特别是几个 ms 的那种
我相同的代码重复提交了 3 次,每次时间都不一样。。。
以 ms 为单位的性能统计,±50ms 很正常的
leetcode 给出的时间没有太大参考性
在Golang中解决Leetcode上求二叉树最大深度的问题时,如果发现两种解法耗时相差两倍,这通常与算法的时间复杂度、空间复杂度以及具体实现细节有关。以下是几个可能导致耗时差异的关键因素:
-
算法复杂度:确保两种解法的时间复杂度都是O(n),其中n是二叉树的节点数。递归解法(如后序遍历)通常能达到这个复杂度,但如果实现不当(如重复计算子树深度),会导致性能下降。
-
递归与迭代:递归解法虽然简洁,但可能因为函数调用栈的开销而影响性能。相比之下,迭代解法(如使用栈或队列进行层次遍历)可能更高效,尤其是在树较深时。
-
内存访问模式:高效的内存访问模式(如局部性原理)可以显著提升性能。如果解法导致频繁的内存分配或缓存未命中,性能可能会受到影响。
-
编译器优化:Golang编译器会对代码进行优化,但不同的写法可能导致优化效果不同。确保代码简洁、清晰,有助于编译器更好地优化。
-
测试环境:测试时的系统负载、CPU缓存状态等也可能影响性能。多次运行测试,并取平均值,可以减少偶然因素的影响。
建议对比两种解法的具体实现,检查是否有不必要的计算或内存分配,优化内存访问模式,并考虑使用迭代方法替代递归,以提高性能。同时,确保测试环境的一致性,以获得更准确的性能评估。