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