Golang Go语言中Leetcode求二叉树的最大深度问题,为什么这两种解法耗时会相差两倍?

发布于 1周前 作者 vueper 来自 Go语言

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

15 回复

要先学会正确的性能测试方法

更多关于Golang Go语言中Leetcode求二叉树的最大深度问题,为什么这两种解法耗时会相差两倍?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


第一个解法,我这边运行是 8ms
做第一个题的时候,就发现同样的代码,执行结果耗时有差异,猜测可能是 gc,或者资源排队等问题。

leetcode 的隔离很差,波动大也很正常

感谢解答,还以为代码里有什么高深莫测的东西。

试一下 maxDepth(root.Left)>maxDepth(root.Right)? 1+maxDepth(root.Left): 1+maxDepth(root.Right);

你自己拿个秒表,掐两次,然后想想为什么其中一次会是另一次时间的两三倍,就知道原因了。

你自己同一个解法不同时间再提交,也可能差两倍

运行一万次的时间 / 10000 是每次运行的时间 [手动狗头]

leetcode 时间并不能作为性能测试的依据,特别是几个 ms 的那种

我相同的代码重复提交了 3 次,每次时间都不一样。。。

以 ms 为单位的性能统计,±50ms 很正常的

leetcode 给出的时间没有太大参考性

在Golang中解决Leetcode上求二叉树最大深度的问题时,如果发现两种解法耗时相差两倍,这通常与算法的时间复杂度、空间复杂度以及具体实现细节有关。以下是几个可能导致耗时差异的关键因素:

  1. 算法复杂度:确保两种解法的时间复杂度都是O(n),其中n是二叉树的节点数。递归解法(如后序遍历)通常能达到这个复杂度,但如果实现不当(如重复计算子树深度),会导致性能下降。

  2. 递归与迭代:递归解法虽然简洁,但可能因为函数调用栈的开销而影响性能。相比之下,迭代解法(如使用栈或队列进行层次遍历)可能更高效,尤其是在树较深时。

  3. 内存访问模式:高效的内存访问模式(如局部性原理)可以显著提升性能。如果解法导致频繁的内存分配或缓存未命中,性能可能会受到影响。

  4. 编译器优化:Golang编译器会对代码进行优化,但不同的写法可能导致优化效果不同。确保代码简洁、清晰,有助于编译器更好地优化。

  5. 测试环境:测试时的系统负载、CPU缓存状态等也可能影响性能。多次运行测试,并取平均值,可以减少偶然因素的影响。

建议对比两种解法的具体实现,检查是否有不必要的计算或内存分配,优化内存访问模式,并考虑使用迭代方法替代递归,以提高性能。同时,确保测试环境的一致性,以获得更准确的性能评估。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!