@@ -7,102 +7,113 @@ public struct UnionFind<T: Hashable> {
7
7
private var size = [ Int] ( )
8
8
9
9
10
- public mutating func addSetWithElement ( element: T ) {
10
+ public mutating func addSetWith ( element: T ) {
11
11
index [ element] = parent. count
12
12
parent. append ( parent. count)
13
13
size. append ( 1 )
14
14
}
15
15
16
- private mutating func findSetByIndexOfElement ( index: Int ) -> Int {
16
+ private mutating func setByIndex ( index: Int ) -> Int {
17
17
if parent [ index] == index {
18
18
return index
19
19
} else {
20
- parent [ index] = findSetByIndexOfElement ( parent [ index] )
20
+ parent [ index] = setByIndex ( parent [ index] )
21
21
return parent [ index]
22
22
}
23
23
}
24
24
25
- public mutating func findSetOfElement ( element: T ) -> Int ? {
25
+ public mutating func setOf ( element: T ) -> Int ? {
26
26
if let indexOfElement = index [ element] {
27
- return findSetByIndexOfElement ( indexOfElement)
27
+ return setByIndex ( indexOfElement)
28
28
} else {
29
29
return nil
30
30
}
31
31
}
32
32
33
- public mutating func unionSetsWithElement ( firstElement: T , andSecondElement secondElement: T ) {
34
- if let firstSet = findSetOfElement ( firstElement) , secondSet = findSetOfElement ( secondElement) {
35
- if ( firstSet != secondSet) {
36
- if ( size [ firstSet] < size [ secondSet] ) {
37
- parent [ firstSet] = secondSet;
33
+ public mutating func unionSetsContaining ( firstElement: T , and secondElement: T ) {
34
+ if let firstSet = setOf ( firstElement) , secondSet = setOf ( secondElement) {
35
+ if firstSet != secondSet {
36
+ if size [ firstSet] < size [ secondSet] {
37
+ parent [ firstSet] = secondSet
38
38
size [ secondSet] += size [ firstSet]
39
39
} else {
40
- parent [ secondSet] = firstSet;
40
+ parent [ secondSet] = firstSet
41
41
size [ firstSet] += size [ secondSet]
42
42
}
43
43
}
44
44
}
45
45
}
46
+
47
+ public mutating func inSameSet( firstElement: T, and secondElement: T) - > Bool {
48
+ if let firstSet = setOf ( firstElement) , secondSet = setOf ( secondElement) {
49
+ return firstSet == secondSet
50
+ } else {
51
+ return false
52
+ }
53
+ }
46
54
}
47
55
48
56
49
57
var dsu = UnionFind < Int > ( )
50
58
51
59
for i in 1 ... 10 {
52
- dsu. addSetWithElement ( i)
60
+ dsu. addSetWith ( i)
53
61
}
54
62
// now our dsu contains 10 independent sets
55
63
56
64
// let's divide our numbers into two sets by divisibility by 2
57
65
for i in 3 ... 10 {
58
66
if i % 2 == 0 {
59
- dsu. unionSetsWithElement ( 2 , andSecondElement : i)
67
+ dsu. unionSetsContaining ( 2 , and : i)
60
68
} else {
61
- dsu. unionSetsWithElement ( 1 , andSecondElement : i)
69
+ dsu. unionSetsContaining ( 1 , and : i)
62
70
}
63
71
}
64
72
65
73
// check our division
66
- print( dsu. findSetOfElement ( 2 ) == dsu. findSetOfElement ( 4 ) )
67
- print( dsu. findSetOfElement ( 4 ) == dsu. findSetOfElement ( 6 ) )
68
- print( dsu. findSetOfElement ( 6 ) == dsu. findSetOfElement ( 8 ) )
69
- print( dsu. findSetOfElement ( 8 ) == dsu. findSetOfElement ( 10 ) )
74
+ print( dsu. inSameSet ( 2 , and: 4 ) )
75
+ print( dsu. inSameSet ( 4 , and: 6 ) )
76
+ print( dsu. inSameSet ( 6 , and: 8 ) )
77
+ print( dsu. inSameSet ( 8 , and: 10 ) )
78
+
79
+
80
+ print( dsu. inSameSet ( 1 , and: 3 ) )
81
+ print( dsu. inSameSet ( 3 , and: 5 ) )
82
+ print( dsu. inSameSet ( 5 , and: 7 ) )
83
+ print( dsu. inSameSet ( 7 , and: 9 ) )
84
+
70
85
71
- print( dsu. findSetOfElement ( 1 ) == dsu. findSetOfElement ( 3 ) )
72
- print( dsu. findSetOfElement ( 3 ) == dsu. findSetOfElement ( 5 ) )
73
- print( dsu. findSetOfElement ( 5 ) == dsu. findSetOfElement ( 7 ) )
74
- print( dsu. findSetOfElement ( 7 ) == dsu. findSetOfElement ( 9 ) )
86
+ print( dsu. inSameSet ( 7 , and: 4 ) )
87
+ print( dsu. inSameSet ( 3 , and: 6 ) )
75
88
76
- print( dsu. findSetOfElement ( 8 ) == dsu. findSetOfElement ( 9 ) )
77
- print( dsu. findSetOfElement ( 4 ) == dsu. findSetOfElement ( 3 ) )
78
89
79
90
80
91
var dsuForStrings = UnionFind < String > ( )
81
92
let words = [ " all " , " border " , " boy " , " afternoon " , " amazing " , " awesome " , " best " ]
82
93
83
- dsuForStrings. addSetWithElement ( " a " )
84
- dsuForStrings. addSetWithElement ( " b " )
94
+ dsuForStrings. addSetWith ( " a " )
95
+ dsuForStrings. addSetWith ( " b " )
85
96
86
97
// In that example we divide strings by its first letter
87
98
for word in words {
88
- dsuForStrings. addSetWithElement ( word)
99
+ dsuForStrings. addSetWith ( word)
89
100
if word. hasPrefix ( " a " ) {
90
- dsuForStrings. unionSetsWithElement ( " a " , andSecondElement : word)
101
+ dsuForStrings. unionSetsContaining ( " a " , and : word)
91
102
} else if word. hasPrefix ( " b " ) {
92
- dsuForStrings. unionSetsWithElement ( " b " , andSecondElement : word)
103
+ dsuForStrings. unionSetsContaining ( " b " , and : word)
93
104
}
94
105
}
95
106
96
- print( dsuForStrings. findSetOfElement ( " a " ) == dsuForStrings . findSetOfElement ( " all " ) )
97
- print( dsuForStrings. findSetOfElement ( " all " ) == dsuForStrings . findSetOfElement ( " awesome " ) )
98
- print( dsuForStrings. findSetOfElement ( " amazing " ) == dsuForStrings . findSetOfElement ( " afternoon " ) )
107
+ print( dsuForStrings. inSameSet ( " a " , and : " all " ) )
108
+ print( dsuForStrings. inSameSet ( " all " , and : " awesome " ) )
109
+ print( dsuForStrings. inSameSet ( " amazing " , and : " afternoon " ) )
99
110
100
- print( dsuForStrings. findSetOfElement ( " b " ) == dsuForStrings . findSetOfElement ( " boy " ) )
101
- print( dsuForStrings. findSetOfElement ( " best " ) == dsuForStrings . findSetOfElement ( " boy " ) )
102
- print( dsuForStrings. findSetOfElement ( " border " ) == dsuForStrings . findSetOfElement ( " best " ) )
111
+ print( dsuForStrings. inSameSet ( " b " , and : " boy " ) )
112
+ print( dsuForStrings. inSameSet ( " best " , and : " boy " ) )
113
+ print( dsuForStrings. inSameSet ( " border " , and : " best " ) )
103
114
104
- print( dsuForStrings. findSetOfElement ( " amazing " ) == dsuForStrings . findSetOfElement ( " boy " ) )
105
- print( dsuForStrings. findSetOfElement ( " all " ) == dsuForStrings . findSetOfElement ( " border " ) )
115
+ print( dsuForStrings. inSameSet ( " amazing " , and : " boy " ) )
116
+ print( dsuForStrings. inSameSet ( " all " , and : " border " ) )
106
117
107
118
108
119
0 commit comments