如何组织包中的Go代码

时间:2016-02-15 20:27:38

标签: go code-structure

我尝试使用Go实现union find算法。我想使用一个结构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]
}

我应该如何组织我的代码以使快速查找算法正常工作,但UnionFind结构是否分开?

3 个答案:

答案 0 :(得分:3)

首先要做的是清楚地解释你的问题。例如,

我想在Go中实现几种替代的union-find算法。例如,快速基金,快速联合,加权QU,路径压缩和加权+路径。请参阅Union-Find Algorithms, Princeton UniversityChapter one of Algorithms in Java by Sedgwick

模拟可能是Go crypto包,它实现了许多替代加密哈希函数。

答案 1 :(得分:1)

您无法在所有联合查找实现中使用相同的结构。例如,加权快速联合除了元素之外还需要树大小的数组。

您在此尝试实现的是以不同方式实现相同的操作。这就是Go中的接口。

另外,使用别名进行包导入以保存几个击键并不是一个好习惯。相反,最好提出一些好的名称,例如包名称及其interace / struct / function名称是有意义的。

我会将所有算法组织在一个包中,结构如下:

public class A {
    @Override
    public int hashCode() {
        // some expensive calculation
    }

    @Override
    public boolean equals(Object obj) {
        // some expensive calculation
    }
}

答案 2 :(得分:0)

我调整了我的代码以获得有效的解决方案。

  • 为公共类型unionfind
  • 提供库/包Unionfind
  • 快速查找算法放入其自己的包'quickfind'及其自己的文件夹
  • 使用unionfind
  • 导入GOPATH默认方式
  • 按功能替换方法

第一个文件是algorithms/unionfind/unionfindtype.go

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}
}

第二个文件是algorithms/unionfind/quickfind/quickfind.go

package quickfind

import ufp "algorithms/unionfind"

func union(uf *ufp.Unionfind, 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 connected(uf *ufp.Unionfind, a int, b int) bool {
    return uf.Elements[a] == uf.Elements[b]
}

感谢JimB和fl0cke的建议。