// Union-find
parent: 0 1->0 2->0 3->0 4
set: A[1, 2, 3], B[3, 6, 5], C[6, 7, 8], D[8, 9, 10], E[10, 11, 1]
0
1
2
A[1, 2, 10], B[3, 6, 5], C[6, 7, 8], D[8, 9, 10],
B1->A1 B1 C1 C3
D1
-1, A1, A1 A1, B3, B3 B6, C6, C6 -1, D8, D8
union
A set[1,2,3,6,5]
a.intersect(b)
[AB, C, D]
A.contains(B.1) -> Bool
set[index] = A.union(B)
set[1].remove
findParent(index) {
if parent[index] != index {
findParent(parent[index])
} else {
return index
}
}
selfPaernt = findParent(duplicatedSetNum)
parent[selfIndex] = selfPaernt
1 2 3
/ \
1 10 11 3 4 5
/
1 8 9
/
8 6 7
(A, B)
C, D
E
Support
Father Mother
\ /
Person
getParent(id) -> [id]
getChild(id) -> [id]
input group: [Person]
Monther of F of John
| |
F of John M of Marry
| |
John Marry
F/A'' F/M/C
| |
F/A' M/A' F/C' M/'C''
| | | |
A C
[[John, Marry], [A, B]]
A3-..., etc
/ A4
A - A1 - A2 B2 C1 C2 D2
\ \ | | / \ /
B C D
CN2 -> N(N-1) / 2
isRealted(p1, p2) -> Bool O(N)
[P1..Pn] -> O(N^2)
(P1, P2)
(P1, P3..Pn)
...
(P2, P3...Pn)
O(N^3)
[person: [parent]]
A: [A1, A3]
B: [A2, B2]
C: [C1, C2]
D:
input: [A, B, C, D]
queue: [A, B, C, D, A1, A3, A2, B2, C1, C2] contains -> O(n) -> log(n)
1 2 3
step:
1: get(A) -> [A1, A3]
2: get(B) -> [A2, B2]
3: get(C) -> [C1, C2]
4: get(D) -> [C2, D2]
Union Set setp2 -> [A, B]
[C, D]
A B C D
A1 A2 B1 B2
A3 A4
B3 (A4==B3)
A: [A3, A1, A2, B, B2,......]
```kotlin=
data class Person (
val id: Int,
val fatherId: Int,
val montherId: Int,
)
val persons: List<Person>
parnets []
|
A, B
|
children []
1. findPersonGrounps(person) -> [Pair(personId, ids)] {
persionId -> getParent(id) -> [ids]
persionId -> getChilren(id) -> [ids]
}
A, B, C, D
A -> [A1...A100]
B -> getParents -> [A1, B1] -> recursion
->
C -> B
2. findPersonGrounpsIntersection(groups)
```
```kotlin=
const val PI = 3.14f
const val size = (Int) -> (Int) {
}
1024 -> 10
logN * logN
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
| | | | <- | ->
[1,2,2, 2,3,4,5,6,7,8,9]
target: 2 -> [1,3]
logN
```