【发布时间】:2016-02-15 20:27:38
【问题描述】:
我正在尝试使用 Go 实现联合查找算法。我想使用一个结构UnionFind 来实施不同的策略,例如快速查找、快速联合和加权快速联合,见下文。我把代码放到一个包里unionfind
package unionfind
type Unionfind struct {
elements []int
}
func makeUnionfind(n int) Unionfind {
elements := make([]int, n)
for idx := range elements {
elements[idx] = idx
}
return Unionfind{elements}
}
接下来我为不同的策略创建函数,从quick find 开始。下面的示例不起作用。但是我不知道策略特定代码放在哪里,如何命名包以及如何导入通用结构类型。
// create a separate package for each strategy?
package quickfind
// import the structure locally?
import ufp "./unionfind"
// prefer methods over functions for convenience?
func (uf *ufp.Unionfind) union(a int, b int) {
aroot := uf.elements[a]
broot := uf.elements[b]
for k, v := range uf.elements {
if v == aroot {
uf.elements[k] = broot
}
}
}
func (uf *ufp.Unionfind) connected(a int, b int) bool {
return uf.elements[a] == uf.elements[b]
}
我应该如何组织我的代码以使 快速查找 算法正常工作,但将 UnionFindstructure 分开?
【问题讨论】:
-
你确定这些是源文件的保存版本吗?该错误表明
quickfind.go文件显示package quickfind(实际上,您似乎将同一个文件粘贴了两次。什么是quickfind.go?) -
你不能在同一个文件夹中有两个包。请阅读golang.org/doc/code.html
-
@sschmeck:您的问题的完整答案是阅读How to Write Go Code 上的文档,链接在这里和两个重复的答案。您的错误的直接答案与其他错误相同,您不能在单个目录中有多个包声明。您遇到的另一个问题是您无法在另一个包的类型上定义方法。方法集是类型的一部分,类型是在“包”中定义的。 (你也有一个永远不应该使用的相对导入)
-
@sschmeck 我建议从一个更简单的程序开始并阅读一些教程。封闭问题的评论部分不是这种建议的最佳位置。这是围棋书列表github.com/dariubs/GoBooks
-
@sschmeck:我不明白这个问题(因为您已经知道可以导出类型)。分享,你的意思是修改吗? Go 是一种静态类型语言,不能直接扩展导入的类型。您可以在包中本地实现接口,例如,参见sort package,或者加密哈希函数如何全部返回
hash.Hash接口。 (您可能想访问更适合对话的论坛,例如邮件列表。)
标签: go code-structure