-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathset.go
150 lines (117 loc) · 4.55 KB
/
set.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package main
import "fmt"
func UseSet() {
setA := &Set{}
setB := &Set{}
setA.Add(10)
setA.Add(20)
setB.Add(10)
setB.Add(20)
setB.Add(50)
setB.Add(60)
setB.Add(70)
fmt.Println(setA.Subset(setB))
fmt.Println(setA.Intersection(setB).Collections())
fmt.Println(setB.Difference(setA).Collections())
fmt.Println(setA.Collections())
setA.Remove(10)
setA.Add(20)
fmt.Println(setA.Collections())
fmt.Println(setA.Contains(10))
setA.Add(10)
setA.Add(60)
fmt.Println(setA.Collections())
fmt.Println(setB.Collections())
fmt.Println(setB.SymmetricDifference(setA))
}
type Set struct {
collection []interface{}
}
func (s *Set) Collections() []interface{} {
return s.collection
}
// Поведение: Добавляет элементы в множество.
// Если элемент уже присутствует в множестве, возвращается false, иначе true.
// Сложность: O(n)
func (s *Set) Add(value interface{}) bool {
if _, exist := s.Contains(value); exist == false {
s.collection = append(s.collection, value)
return true
}
return false
}
// Поведение: Возвращает index, true, если множество содержит указанный элемент.
// В противном случае возвращает index, false.
// Сложность: O(n)
func (s *Set) Contains(value interface{}) (int, bool) {
for k, v := range s.collection {
if v == value {
return k, true
}
}
return 0, false
}
// Поведение: Удаляет указанный элемент из множества и возвращает true.
// В случае, если элемент нет и он не удален, возвращает false.
// Сложность: O(n)
func (s *Set) Remove(value interface{}) bool {
if i, exist := s.Contains(value); exist == true {
length := s.Size()
s.collection[i] = s.collection[length-1]
s.collection = s.collection[:length-1]
return true
}
return false
}
func (s *Set) Size() int {
return len(s.collection)
}
// Поведение: Возвращает множество, полученное операцией объединения его с указанным.
// Сложность: O(m·n), где m и n — количество элементов переданного и текущего множеств соответственно.
func (s *Set) Union(set *Set) *Set {
union := &Set{}
for _, v := range s.Collections() {
union.Add(v)
}
for _, v := range set.Collections() {
union.Add(v)
}
return union
}
// Поведение: Возвращает множество, полученное операцией пересечения его с указанным.
// Сложность: O(m·n), где m и n — количество элементов переданного и текущего множеств соответственно.
func (s *Set) Intersection(set *Set) *Set {
intersection := &Set{}
for _, v := range s.Collections() {
if _, exist := set.Contains(v); exist == true {
intersection.Add(v)
}
}
return intersection
}
// Поведение: Возвращает множество, являющееся разностью текущего с указанным.
// Сложность: O(m·n), где m и n — количество элементов переданного и текущего множеств соответственно.
func (s *Set) Difference(set *Set) *Set {
difference := &Set{}
for _, v := range s.Collections() {
if _, exist := set.Contains(v); exist == false {
difference.Add(v)
}
}
return difference
}
// Поведение: Возвращает true, если второе множество является подмножеством первого, в противном случае возвращает false.
// Сложность: O(m·n), где m и n — количество элементов переданного и текущего множеств соответственно.
func (s *Set) Subset(set *Set) bool {
if s.Size() > set.Size() {
return false
}
return s.Difference(set).Size() == 0
}
// Поведение: Возвращает множество, являющееся симметрической разностью текущего с указанным.
// Сложность: O(m·n), где m и n — количество элементов переданного и текущего множеств соответственно.
func (s *Set) SymmetricDifference(set *Set) *Set {
a := s.Difference(set)
b := set.Difference(s)
return a.Union(b)
}