1 回答
TA贡献1824条经验 获得超8个赞
这是创建树的方法(未测试):
func FillLevel(parents []*Node, level []string) (children []*Node, err error){
if len(parents) + 1 != len(level) {
return nil, errors.New("params size not OK")
}
for i, p := range parents {
leftVal, err := strconv.Atoi(level[i])
rightVal, err := strconv.Atoi(level[i+1])
if err != nil {
return nil, err
}
p.Left = NewNode(leftVal)
p.Right = NewNode(rightVal)
children = append(children, p.Left)
if i == len(parents) - 1 {
children = append(children, p.Right)
}
}
return children, nil
}
func FillNodes(lines *[][]string) (*Node, error){
nodes := *lines
rootInt, _ := strconv.Atoi(nodes[0][0])
root := NewNode(rootInt)
// add the values here
parents := []*Node{root}
for _, level := range nodes[1:] {
parents, _ = FillLevel(parents, level)
}
return root, nil
}
func main() {
nodes := OpenFile()
r, _ := FillNodes(&nodes)
wg.Add(1)
r.DFS()
wg.Wait()
}
如果这是用于生产,我的建议是对它进行 TDD,并正确处理所有错误并决定您的软件应该如何处理每个错误。您还可以编写一些基准,然后使用 goroutine 优化算法(如果适用)
你现在的做法,没有 goroutines 会更好:想象你有一个巨大的树,有 1M 个节点,DFS 函数将递归启动 1M 个 goroutines,每个 goroutines 都有内存和 CPU 额外成本而不做很多来证明它是合理的。您需要一种更好的方法来拆分工作以在更少的 goroutine 上完成,每个 goroutine 可能有 10000 个节点。
我强烈建议你编写一个没有 goroutines 的版本,研究它的复杂性,编写基准来验证预期的复杂性。一旦你有了它,就开始寻找引入 goroutines 的策略,并验证它是否比你已经拥有的更有效。
- 1 回答
- 0 关注
- 90 浏览
添加回答
举报