Algorithm 惯用Go中集合的最小值

Algorithm 惯用Go中集合的最小值,algorithm,go,set,idioms,Algorithm,Go,Set,Idioms,如何编写返回go中集合的最小值的函数?我不仅仅是在寻找一个解决方案(我知道我可以在迭代第一个元素时初始化最小值,然后设置一个布尔变量来初始化最小值),而是一个惯用的解决方案。由于go没有本机集,假设我们有一个map[Cell]bool 映射是Go中实现集合的惯用方法。惯用代码使用bool或struct{}作为映射的值类型。后者使用更少的存储空间,但需要在键盘上输入更多的内容才能使用 假设单元格的最大值为maxCell,则此函数将计算最小值: func min(m map[Cell]bool) C

如何编写返回go中集合的最小值的函数?我不仅仅是在寻找一个解决方案(我知道我可以在迭代第一个元素时初始化最小值,然后设置一个布尔变量来初始化最小值),而是一个惯用的解决方案。由于go没有本机集,假设我们有一个
map[Cell]bool

映射是Go中实现集合的惯用方法。惯用代码使用bool或struct{}作为映射的值类型。后者使用更少的存储空间,但需要在键盘上输入更多的内容才能使用

假设单元格的最大值为
maxCell
,则此函数将计算最小值:

func min(m map[Cell]bool) Cell {
    min := maxCell
    for k := range m {
        if k < min {
            min = k
        }
    }
    return min
}
func-min(m-map[Cell]bool)单元格{
最小:=maxCell
对于k:=范围m{
如果k
如果单元格是数字类型,则可以将maxCell设置为以下类型之一

任何使用映射的解决方案都需要在键上进行循环


你可以在地图上找到一个最小值。这将需要更多的存储和代码,但效率可能会更高,具体取决于集合的大小和调用最小函数的频率。

映射是在Go中实现集合的惯用方法。惯用代码使用bool或struct{}作为映射的值类型。后者使用更少的存储空间,但需要在键盘上输入更多的内容才能使用

假设单元格的最大值为
maxCell
,则此函数将计算最小值:

func min(m map[Cell]bool) Cell {
    min := maxCell
    for k := range m {
        if k < min {
            min = k
        }
    }
    return min
}
func-min(m-map[Cell]bool)单元格{
最小:=maxCell
对于k:=范围m{
如果k
如果单元格是数字类型,则可以将maxCell设置为以下类型之一

任何使用映射的解决方案都需要在键上进行循环


你可以在地图上找到一个最小值。这将需要更多的存储和代码,但效率可能会更高,具体取决于集合的大小和调用最小函数的频率。

另一种方法是,根据集合的大小,使用自排序切片可能会更高效:

type Cell uint64

type CellSet struct {
    cells []Cell
}

func (cs *CellSet) Len() int {
    return len(cs.cells)
}

func (cs *CellSet) Swap(i, j int) {
    cs.cells[i], cs.cells[j] = cs.cells[j], cs.cells[i]
}

func (cs *CellSet) Less(i, j int) bool {
    return cs.cells[i] < cs.cells[j]
}

func (cs *CellSet) Add(c Cell) {
    for _, v := range cs.cells {
        if v == c {
            return
        }
    }
    cs.cells = append(cs.cells, c)
    sort.Sort(cs)
}

func (cs *CellSet) Min() Cell {
    if cs.Len() > 0 {
        return cs.cells[0]
    }
    return 0
}

func (cs *CellSet) Max() Cell {
    if l := cs.Len(); l > 0 {
        return cs.cells[l-1]
    }
    return ^Cell(0)
}

另一种方法是,根据集合的大小,使用自排序切片可能更有效:

type Cell uint64

type CellSet struct {
    cells []Cell
}

func (cs *CellSet) Len() int {
    return len(cs.cells)
}

func (cs *CellSet) Swap(i, j int) {
    cs.cells[i], cs.cells[j] = cs.cells[j], cs.cells[i]
}

func (cs *CellSet) Less(i, j int) bool {
    return cs.cells[i] < cs.cells[j]
}

func (cs *CellSet) Add(c Cell) {
    for _, v := range cs.cells {
        if v == c {
            return
        }
    }
    cs.cells = append(cs.cells, c)
    sort.Sort(cs)
}

func (cs *CellSet) Min() Cell {
    if cs.Len() > 0 {
        return cs.cells[0]
    }
    return 0
}

func (cs *CellSet) Max() Cell {
    if l := cs.Len(); l > 0 {
        return cs.cells[l-1]
    }
    return ^Cell(0)
}

如果使用排序的切片(插入时排序),则无需循环即可获得min/max。数学常数就是我要找的。不幸的是,go没有一个整数的min函数,所以您可以只写min=math.min(min,k)。哦,好吧。如果你使用一个排序的切片(插入时排序),你不必循环得到min/max。数学常数就是我要找的。不幸的是,go没有一个整数的min函数,所以您可以只写min=math.min(min,k)。哦,好吧。