Golang Set 数据结构

package intset

type Set map[int]struct{}

func New(v ...int) Set {
    s := Set{}
    s.Add(v...)
    return s
}

func (s Set) Add(v ...int) {
    for _, i := range v {
        s[i] = struct{}{}
    }
}

func (s Set) Cardinality() int {
    return len(s)
}

func (s Set) Contains(v int) bool {
    _, ok := s[v]
    return ok
}

func (s Set) Remove(v int) {
    delete(s, v)
}

func (s Set) ToSlice() []int {
    var rs []int
    for v := range s {
        rs = append(rs, v)
    }
    return rs
}

// 子1
func (s Set) IsSubset(o Set) bool {
    if s.Cardinality() > o.Cardinality() {
        return false
    }
    for v := range s {
        if !o.Contains(v) {
            return false
        }
    }
    return true
}

// 子2
func (s Set) Equal(o Set) bool {
    if s.Cardinality() != o.Cardinality() {
        return false
    }
    for v := range s {
        if !o.Contains(v) {
            return false
        }
    }
    return true
}

// 子3
func (s Set) IsProperSubset(o Set) bool {
    if s.Cardinality() >= o.Cardinality() {
        return false
    }
    return s.IsSubset(o)
}

// 子4
func (s Set) IsSuperSet(o Set) bool {
    return o.IsSubset(s)
}

// 交
func (s Set) InterSec(o Set) Set {
    r := New()
    //loop smaller set
    if s.Cardinality() < o.Cardinality() {
        for v := range s {
            if o.Contains(v) {
                r.Add(v)
            }
        }
    } else {
        for v := range o {
            if s.Contains(v) {
                r.Add(v)
            }
        }
    }
    return r
}

// 并
func (s Set) Union(o Set) Set {
    r := Newint()
    for v1 := range s {
        r.Add(v1)
    }
    for v2 := range o {
        r.Add(v2)
    }
    return r
}

// 补1
func (s Set) Difference(o Set) Set {
    r := New()
    for v := range s {
        if !o.Contains(v) {
            r.Add(v)
        }
    }
    return r
}

// 补2
func (s Set) SymmetricDifference(o Set) Set {
    return s.Difference(o).Union(o.Difference(s))
}

//func (s Set) CartesianProduct(o Set) {
//
//}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容