Golang的性能表现足够优秀吗?

Golang的性能表现足够优秀吗? 一天,我的朋友问我是否还记得八皇后问题的解法。 我告诉他答案是记不清了。 实际上,我之前从未研究过这个问题。 那次聊天后,我决定用我最近热衷的Golang来解决这个问题。

以下是我的代码:

我的"八皇后问题"解决方案

在上面的代码中,我在屏幕上打印了解决方案,但这不是必需的,你可以移除visualize函数,只进行计数。

在我的旧ThinkPad E431上:

  • 运行8皇后问题耗时不到1毫秒(不打印) image

  • 运行9皇后问题耗时不到2毫秒(不打印) 9

  • 运行10皇后问题耗时不到9毫秒(不打印) 10

那么…这样的性能足够好吗?


更多关于Golang的性能表现足够优秀吗?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

更易阅读,感谢。

更多关于Golang的性能表现足够优秀吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好

也许可以使用结构体来表示x、y坐标,并用类型定义坐标切片。如下所示:

package main

import (
	"fmt"
)

type Coord struct {
	X int
	Y int
}

type Coords []Coord

func main() {
	coords := Coords{
		Coord{1, 2},
		Coord{3, 4},
		Coord{5, 6},
	}
	fmt.Println(coords)
}

从你的测试结果来看,Go语言在解决八皇后问题上的性能表现确实非常出色。你的代码通过回溯算法高效地解决了问题,并且在8、9、10皇后问题上的运行时间都保持在毫秒级别,这充分展示了Go在计算密集型任务中的优势。

以下是对你代码的简要分析和一个优化后的示例,以展示Go的性能潜力:

代码分析

你的实现使用了经典的回溯算法,通过递归探索所有可能的皇后位置,并利用切片来跟踪列、主对角线和副对角线的占用情况。这种方法的时间复杂度为O(N!),但对于N<=10来说,完全在可接受范围内。

性能优化示例

虽然你的代码已经足够高效,但我们可以通过一些微优化来进一步提升性能,例如避免在递归中传递过多的参数,或使用更高效的数据结构。以下是一个简化版本的代码,专注于计数解决方案,并减少了一些不必要的操作:

package main

import (
	"fmt"
	"time"
)

func main() {
	for n := 8; n <= 10; n++ {
		start := time.Now()
		count := solveNQueens(n)
		elapsed := time.Since(start)
		fmt.Printf("%d queens: %d solutions, time: %v\n", n, count, elapsed)
	}
}

func solveNQueens(n int) int {
	cols := make([]bool, n)
	d1 := make([]bool, 2*n-1) // 主对角线
	d2 := make([]bool, 2*n-1) // 副对角线
	return backtrack(0, n, cols, d1, d2)
}

func backtrack(row, n int, cols, d1, d2 []bool) int {
	if row == n {
		return 1
	}
	count := 0
	for col := 0; col < n; col++ {
		id1 := row - col + n - 1
		id2 := row + col
		if cols[col] || d1[id1] || d2[id2] {
			continue
		}
		cols[col] = true
		d1[id1] = true
		d2[id2] = true
		count += backtrack(row+1, n, cols, d1, d2)
		cols[col] = false
		d1[id1] = false
		d2[id2] = false
	}
	return count
}

性能说明

  • 8皇后:通常有92种解决方案,在你的机器上耗时不到1毫秒,符合预期。
  • 9皇后:352种解决方案,耗时不到2毫秒,显示线性增长。
  • 10皇后:724种解决方案,耗时不到9毫秒,随着N增加,时间增长在合理范围内。

结论

Go语言在处理这类算法问题时表现优异,得益于其编译型语言的效率和轻量级的协程模型(虽然在此问题中未使用并发)。你的代码已经足够高效,对于N<=10的问题,性能完全满足需求。如果需要处理更大的N(如15以上),可以考虑进一步优化算法或利用并发计算。

总之,从你的测试结果来看,Go的性能在八皇后问题上确实足够优秀。

回到顶部