Skip to content

Commit 86919b8

Browse files
meetvalanisiriak
andauthored
Add set data structure (#314)
Co-authored-by: Andrii Siriak <[email protected]>
1 parent 089708a commit 86919b8

File tree

2 files changed

+150
-0
lines changed

2 files changed

+150
-0
lines changed

DIRECTORY.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@
150150
* [Linear Search](https://github.com/TheAlgorithms/Go/blob/master/searches/linear_search.go)
151151
* [Search Test](https://github.com/TheAlgorithms/Go/blob/master/searches/search_test.go)
152152

153+
## Set
154+
* [Set](https://github.com/TheAlgorithms/Go/blob/master/set/set.go)
155+
153156
## Sorts
154157
* [Bubble Sort](https://github.com/TheAlgorithms/Go/blob/master/sorts/bubble_sort.go)
155158
* [Heap Sort](https://github.com/TheAlgorithms/Go/blob/master/sorts/heap_sort.go)

set/set.go

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package set
2+
3+
// New gives new set.
4+
func New(items ...interface{}) Set {
5+
st := set{
6+
elements: make(map[interface{}]bool),
7+
}
8+
for _, item := range items {
9+
st.Add(item)
10+
}
11+
return &st
12+
}
13+
14+
// Set is an interface of possible methods on 'set'.
15+
type Set interface {
16+
// Add: adds new element to the set
17+
Add(item interface{})
18+
// Delete: delets the passed element from the set if present
19+
Delete(item interface{})
20+
// Len: gives the length of the set (total no. of elements in set)
21+
Len() int
22+
// GetItems: gives the array( []interface{} ) of elements of the set.
23+
GetItems() []interface{}
24+
// In: checks whether item is present in set or not.
25+
In(item interface{}) bool
26+
// IsSubsetOf: checks wether set is subset of set2 or not.
27+
IsSubsetOf(set2 Set) bool
28+
// IsSupersetOf: checks wether set is superset of set2 or not.
29+
IsSupersetOf(set2 Set) bool
30+
// Union: gives new union set of both sets.
31+
// ex: [1,2,3] union [3,4,5] -> [1,2,3,4,5]
32+
Union(set2 Set) Set
33+
// Intersection: gives new intersection set of both sets.
34+
// ex: [1,2,3] Intersection [3,4,5] -> [3]
35+
Intersection(set2 Set) Set
36+
// Difference: gives new difference set of both sets.
37+
// ex: [1,2,3] Difference [3,4,5] -> [1,2]
38+
Difference(set2 Set) Set
39+
// SymmetricDifference: gives new symmetric difference set of both sets.
40+
// ex: [1,2,3] SymmetricDifference [3,4,5] -> [1,2,4,5]
41+
SymmetricDifference(set2 Set) Set
42+
}
43+
44+
type set struct {
45+
elements map[interface{}]bool
46+
}
47+
48+
func (st *set) Add(value interface{}) {
49+
st.elements[value] = true
50+
}
51+
52+
func (st *set) Delete(value interface{}) {
53+
delete(st.elements, value)
54+
}
55+
56+
func (st *set) GetItems() []interface{} {
57+
keys := make([]interface{}, 0, len(st.elements))
58+
for k := range st.elements {
59+
keys = append(keys, k)
60+
}
61+
return keys
62+
}
63+
64+
func (st *set) Len() int {
65+
return len(st.elements)
66+
}
67+
68+
func (st *set) In(value interface{}) bool {
69+
if _, in := st.elements[value]; in {
70+
return true
71+
}
72+
return false
73+
}
74+
75+
func (st *set) IsSubsetOf(superSet Set) bool {
76+
if st.Len() > superSet.Len() {
77+
return false
78+
}
79+
80+
for _, item := range st.GetItems() {
81+
if !superSet.In(item) {
82+
return false
83+
}
84+
}
85+
return true
86+
}
87+
88+
func (st *set) IsSupersetOf(subSet Set) bool {
89+
return subSet.IsSubsetOf(st)
90+
}
91+
92+
func (st *set) Union(st2 Set) Set {
93+
unionSet := New()
94+
for _, item := range st.GetItems() {
95+
unionSet.Add(item)
96+
}
97+
for _, item := range st2.GetItems() {
98+
unionSet.Add(item)
99+
}
100+
return unionSet
101+
}
102+
103+
func (st *set) Intersection(st2 Set) Set {
104+
intersectionSet := New()
105+
var minSet, maxSet Set
106+
if st.Len() > st2.Len() {
107+
minSet = st2
108+
maxSet = st
109+
} else {
110+
minSet = st
111+
maxSet = st2
112+
}
113+
for _, item := range minSet.GetItems() {
114+
if maxSet.In(item) {
115+
intersectionSet.Add(item)
116+
}
117+
}
118+
return intersectionSet
119+
}
120+
121+
func (st *set) Difference(st2 Set) Set {
122+
differenceSet := New()
123+
for _, item := range st.GetItems() {
124+
if !st2.In(item) {
125+
differenceSet.Add(item)
126+
}
127+
}
128+
return differenceSet
129+
}
130+
131+
func (st *set) SymmetricDifference(st2 Set) Set {
132+
symmetricDifferenceSet := New()
133+
dropSet := New()
134+
for _, item := range st.GetItems() {
135+
if st2.In(item) {
136+
dropSet.Add(item)
137+
} else {
138+
symmetricDifferenceSet.Add(item)
139+
}
140+
}
141+
for _, item := range st2.GetItems() {
142+
if !dropSet.In(item) {
143+
symmetricDifferenceSet.Add(item)
144+
}
145+
}
146+
return symmetricDifferenceSet
147+
}

0 commit comments

Comments
 (0)