From 4520d84e3857b11e3bdc2bc17f351a0cfe85412e Mon Sep 17 00:00:00 2001 From: Dan Date: Sun, 2 Oct 2022 17:54:07 -0400 Subject: [PATCH 1/2] added Union Find progression basic, path_compression, quickfind, quickunion, optimized --- .../DisjointSet/01_basic_disjointset.py | 45 +++++++++++++++++++ .../DisjointSet/02_path_compression.py | 35 +++++++++++++++ .../DisjointSet/03_quickfind_disjoint.py | 37 +++++++++++++++ .../DisjointSet/04_quickunion_disjoint.py | 44 ++++++++++++++++++ .../DisjointSet/05_optimized_disjoint.py | 44 ++++++++++++++++++ Graphs/UnionFind/DisjointSet/README.md | 0 6 files changed, 205 insertions(+) create mode 100644 Graphs/UnionFind/DisjointSet/01_basic_disjointset.py create mode 100644 Graphs/UnionFind/DisjointSet/02_path_compression.py create mode 100644 Graphs/UnionFind/DisjointSet/03_quickfind_disjoint.py create mode 100644 Graphs/UnionFind/DisjointSet/04_quickunion_disjoint.py create mode 100644 Graphs/UnionFind/DisjointSet/05_optimized_disjoint.py create mode 100644 Graphs/UnionFind/DisjointSet/README.md diff --git a/Graphs/UnionFind/DisjointSet/01_basic_disjointset.py b/Graphs/UnionFind/DisjointSet/01_basic_disjointset.py new file mode 100644 index 00000000..37ddc815 --- /dev/null +++ b/Graphs/UnionFind/DisjointSet/01_basic_disjointset.py @@ -0,0 +1,45 @@ +# The vey basics of union find and disjoint sets +# Basically an array and within that array lies a disjoint set + + +# There are two functions when discussing disjoint sets + +# find(a) which takes in a single argument and returns the root of +# that particular node + +# union(a,b) which takes in two arguments and combines them together +# let's watch a quick video on how this works and then implement from there + +# First lets implement UnionFind as an object and instantiate it with an array + +class UnionFind: + def __init__(self, size): + self.root = [i for i in range(size)] + + # union connects two nodes with a left bias meaning that b will always + # connect to a + def union(self, x, y): + rootX = self.find(x) + rootY = self.find(y) + if rootX != rootY: + for i in range(len(self.root)): + if self.root[i] == rootY: + self.root[i] = rootX + + # takes in a node a and returns the root node of such + def find(self, a): + while a != self.root[a]: + a = self.root[a] + return a + +uu = UnionFind(10) + +print(uu.root) +uu.union(0,1) +uu.union(0,2) +uu.union(1,3) +uu.union(4,8) +uu.union(5,6) +uu.union(5,7) +print(uu.root) +print([i for i in range(10)]) \ No newline at end of file diff --git a/Graphs/UnionFind/DisjointSet/02_path_compression.py b/Graphs/UnionFind/DisjointSet/02_path_compression.py new file mode 100644 index 00000000..282fd399 --- /dev/null +++ b/Graphs/UnionFind/DisjointSet/02_path_compression.py @@ -0,0 +1,35 @@ + +class UnionFind: + def __init__(self,size): + self.root = [i for i in range(size)] + + def find(self, n): + if self.root[n] == n: + return n + + self.root[n] = self.find(self.root[n]) + return self.root[n] + # quick union + def union(self, a, b): + fa = self.find(a) + fb = self.find(b) + if fa != fb: + self.root[fa] = fb + + def connected(self, x, y): + return self.find(x) == self.find(y) +# Test Case +uf = UnionFind(10) +# 1-2-5-6-7 3-8-9 4 +uf.union(1, 2) +uf.union(2, 5) +uf.union(5, 6) +uf.union(6, 7) +uf.union(3, 8) +uf.union(8, 9) +print(uf.connected(1, 5)) # true +print(uf.connected(5, 7)) # true +print(uf.connected(4, 9)) # false +# 1-2-5-6-7 3-8-9-4 +uf.union(9, 4) +print(uf.connected(4, 9)) # true \ No newline at end of file diff --git a/Graphs/UnionFind/DisjointSet/03_quickfind_disjoint.py b/Graphs/UnionFind/DisjointSet/03_quickfind_disjoint.py new file mode 100644 index 00000000..c11e9f9b --- /dev/null +++ b/Graphs/UnionFind/DisjointSet/03_quickfind_disjoint.py @@ -0,0 +1,37 @@ +class UnionFind: + def __init__(self, size): + self.root = [i for i in range(size)] + # changing quickfind to have the parent node be stored in the array + # effectively making it an O(1) operation to find the root of a given node + # however, union will take a hit in performance + + def find(self, n): + return self.root[n] + + def union(self, a, b): + fa = self.find(a) + fb = self.find(b) + if fa != fb: + for i, v in enumerate(self.root): + if fa == v: + self.root[i] = fb + + def connected(self, x, y): + return self.find(x) == self.find(y) + + +# Test Case +uf = UnionFind(10) +# 1-2-5-6-7 3-8-9 4 +uf.union(1, 2) +uf.union(2, 5) +uf.union(5, 6) +uf.union(6, 7) +uf.union(3, 8) +uf.union(8, 9) +print(uf.connected(1, 5)) # true +print(uf.connected(5, 7)) # true +print(uf.connected(4, 9)) # false +# 1-2-5-6-7 3-8-9-4 +uf.union(9, 4) +print(uf.connected(4, 9)) # true \ No newline at end of file diff --git a/Graphs/UnionFind/DisjointSet/04_quickunion_disjoint.py b/Graphs/UnionFind/DisjointSet/04_quickunion_disjoint.py new file mode 100644 index 00000000..0c734e74 --- /dev/null +++ b/Graphs/UnionFind/DisjointSet/04_quickunion_disjoint.py @@ -0,0 +1,44 @@ +# The vey basics of union find and disjoint sets +# Basically an array and within that array lies a disjoint set + + +# There are two functions when discussing disjoint sets + +# find(a) which takes in a single argument and returns the root of +# that particular node + +# union(a,b) which takes in two arguments and combines them together +# let's watch a quick video on how this works and then implement from there + +# First lets implement UnionFind as an object and instantiate it with an array + +class UnionFind: + def __init__(self, size): + self.root = [i for i in range(size)] + + # union connects two nodes with a left bias meaning that b will always + # connect to a + def union(self,a,b): + # Basically we want to take the parent node of the given thing + fa = self.find(a) + fb = self.find(b) + if fa != fb: + self.root[fa] = fb + + # takes in a node a and returns the root node of such + def find(self, a): + while a != self.root[a]: + a = self.root[a] + return a + +uu = UnionFind(10) + +print(uu.root) +uu.union(0,1) +uu.union(0,2) +uu.union(1,3) +uu.union(4,8) +uu.union(5,6) +uu.union(5,7) +print(uu.root) +print([i for i in range(10)]) \ No newline at end of file diff --git a/Graphs/UnionFind/DisjointSet/05_optimized_disjoint.py b/Graphs/UnionFind/DisjointSet/05_optimized_disjoint.py new file mode 100644 index 00000000..a177cc5d --- /dev/null +++ b/Graphs/UnionFind/DisjointSet/05_optimized_disjoint.py @@ -0,0 +1,44 @@ +# Optimized union find program that implements union by rank + +class UnionFind: + def __init__(self, size): + self.root = [i for i in range(size)] + self.rank = [1] * size + + # Recurrsively update root + def find(self, n): + if self.root[n] != n: + self.root[n] = self.find(self.root[n]) + return self.root[n] + + def union(self, a, b): + fa = self.find(a) + fb = self.find(b) + + if fa != fb: + if self.rank[fa] > self.rank[fb]: + self.root[fb] = fa + elif self.rank[fa] < self.rank[fb]: + self.root[fa] = fb + else: + self.root[fa] = fb + self.rank[fb] += 1 + + def connected(self, x, y): + return self.find(x) == self.find(y) + +# Test Case +uf = UnionFind(10) +# 1-2-5-6-7 3-8-9 4 +uf.union(1, 2) +uf.union(2, 5) +uf.union(5, 6) +uf.union(6, 7) +uf.union(3, 8) +uf.union(8, 9) +print(uf.connected(1, 5)) # true +print(uf.connected(5, 7)) # true +print(uf.connected(4, 9)) # false +# 1-2-5-6-7 3-8-9-4 +uf.union(9, 4) +print(uf.connected(4, 9)) # true \ No newline at end of file diff --git a/Graphs/UnionFind/DisjointSet/README.md b/Graphs/UnionFind/DisjointSet/README.md new file mode 100644 index 00000000..e69de29b From 167970b22ebe3e1497f167631edcf5b7ca26966e Mon Sep 17 00:00:00 2001 From: Dan Date: Sat, 8 Oct 2022 21:47:07 -0400 Subject: [PATCH 2/2] Added Basic UnionFind --- .../{DisjointSet => }/01_basic_disjointset.py | 12 +-- .../DisjointSet/02_path_compression.py | 35 ------- .../DisjointSet/03_quickfind_disjoint.py | 37 -------- .../DisjointSet/04_quickunion_disjoint.py | 44 --------- .../DisjointSet/05_optimized_disjoint.py | 44 --------- Graphs/UnionFind/DisjointSet/README.md | 0 .../Images/basic_union/basic_union.png | Bin 0 -> 26473 bytes .../Images/basic_union/basic_union_1.png | Bin 0 -> 21755 bytes .../Images/basic_union/basic_union_2.png | Bin 0 -> 25677 bytes .../Images/basic_union/basic_union_3.png | Bin 0 -> 25543 bytes Graphs/UnionFind/README.md | 86 ++++++++++++++++++ 11 files changed, 91 insertions(+), 167 deletions(-) rename Graphs/UnionFind/{DisjointSet => }/01_basic_disjointset.py (90%) delete mode 100644 Graphs/UnionFind/DisjointSet/02_path_compression.py delete mode 100644 Graphs/UnionFind/DisjointSet/03_quickfind_disjoint.py delete mode 100644 Graphs/UnionFind/DisjointSet/04_quickunion_disjoint.py delete mode 100644 Graphs/UnionFind/DisjointSet/05_optimized_disjoint.py delete mode 100644 Graphs/UnionFind/DisjointSet/README.md create mode 100644 Graphs/UnionFind/Images/basic_union/basic_union.png create mode 100644 Graphs/UnionFind/Images/basic_union/basic_union_1.png create mode 100644 Graphs/UnionFind/Images/basic_union/basic_union_2.png create mode 100644 Graphs/UnionFind/Images/basic_union/basic_union_3.png create mode 100644 Graphs/UnionFind/README.md diff --git a/Graphs/UnionFind/DisjointSet/01_basic_disjointset.py b/Graphs/UnionFind/01_basic_disjointset.py similarity index 90% rename from Graphs/UnionFind/DisjointSet/01_basic_disjointset.py rename to Graphs/UnionFind/01_basic_disjointset.py index 37ddc815..8ad64d30 100644 --- a/Graphs/UnionFind/DisjointSet/01_basic_disjointset.py +++ b/Graphs/UnionFind/01_basic_disjointset.py @@ -32,14 +32,12 @@ def find(self, a): a = self.root[a] return a -uu = UnionFind(10) +uu = UnionFind(6) print(uu.root) uu.union(0,1) -uu.union(0,2) -uu.union(1,3) -uu.union(4,8) -uu.union(5,6) -uu.union(5,7) +uu.union(4,5) +uu.union(1,4) + print(uu.root) -print([i for i in range(10)]) \ No newline at end of file +#print([i for i in range(6)]) \ No newline at end of file diff --git a/Graphs/UnionFind/DisjointSet/02_path_compression.py b/Graphs/UnionFind/DisjointSet/02_path_compression.py deleted file mode 100644 index 282fd399..00000000 --- a/Graphs/UnionFind/DisjointSet/02_path_compression.py +++ /dev/null @@ -1,35 +0,0 @@ - -class UnionFind: - def __init__(self,size): - self.root = [i for i in range(size)] - - def find(self, n): - if self.root[n] == n: - return n - - self.root[n] = self.find(self.root[n]) - return self.root[n] - # quick union - def union(self, a, b): - fa = self.find(a) - fb = self.find(b) - if fa != fb: - self.root[fa] = fb - - def connected(self, x, y): - return self.find(x) == self.find(y) -# Test Case -uf = UnionFind(10) -# 1-2-5-6-7 3-8-9 4 -uf.union(1, 2) -uf.union(2, 5) -uf.union(5, 6) -uf.union(6, 7) -uf.union(3, 8) -uf.union(8, 9) -print(uf.connected(1, 5)) # true -print(uf.connected(5, 7)) # true -print(uf.connected(4, 9)) # false -# 1-2-5-6-7 3-8-9-4 -uf.union(9, 4) -print(uf.connected(4, 9)) # true \ No newline at end of file diff --git a/Graphs/UnionFind/DisjointSet/03_quickfind_disjoint.py b/Graphs/UnionFind/DisjointSet/03_quickfind_disjoint.py deleted file mode 100644 index c11e9f9b..00000000 --- a/Graphs/UnionFind/DisjointSet/03_quickfind_disjoint.py +++ /dev/null @@ -1,37 +0,0 @@ -class UnionFind: - def __init__(self, size): - self.root = [i for i in range(size)] - # changing quickfind to have the parent node be stored in the array - # effectively making it an O(1) operation to find the root of a given node - # however, union will take a hit in performance - - def find(self, n): - return self.root[n] - - def union(self, a, b): - fa = self.find(a) - fb = self.find(b) - if fa != fb: - for i, v in enumerate(self.root): - if fa == v: - self.root[i] = fb - - def connected(self, x, y): - return self.find(x) == self.find(y) - - -# Test Case -uf = UnionFind(10) -# 1-2-5-6-7 3-8-9 4 -uf.union(1, 2) -uf.union(2, 5) -uf.union(5, 6) -uf.union(6, 7) -uf.union(3, 8) -uf.union(8, 9) -print(uf.connected(1, 5)) # true -print(uf.connected(5, 7)) # true -print(uf.connected(4, 9)) # false -# 1-2-5-6-7 3-8-9-4 -uf.union(9, 4) -print(uf.connected(4, 9)) # true \ No newline at end of file diff --git a/Graphs/UnionFind/DisjointSet/04_quickunion_disjoint.py b/Graphs/UnionFind/DisjointSet/04_quickunion_disjoint.py deleted file mode 100644 index 0c734e74..00000000 --- a/Graphs/UnionFind/DisjointSet/04_quickunion_disjoint.py +++ /dev/null @@ -1,44 +0,0 @@ -# The vey basics of union find and disjoint sets -# Basically an array and within that array lies a disjoint set - - -# There are two functions when discussing disjoint sets - -# find(a) which takes in a single argument and returns the root of -# that particular node - -# union(a,b) which takes in two arguments and combines them together -# let's watch a quick video on how this works and then implement from there - -# First lets implement UnionFind as an object and instantiate it with an array - -class UnionFind: - def __init__(self, size): - self.root = [i for i in range(size)] - - # union connects two nodes with a left bias meaning that b will always - # connect to a - def union(self,a,b): - # Basically we want to take the parent node of the given thing - fa = self.find(a) - fb = self.find(b) - if fa != fb: - self.root[fa] = fb - - # takes in a node a and returns the root node of such - def find(self, a): - while a != self.root[a]: - a = self.root[a] - return a - -uu = UnionFind(10) - -print(uu.root) -uu.union(0,1) -uu.union(0,2) -uu.union(1,3) -uu.union(4,8) -uu.union(5,6) -uu.union(5,7) -print(uu.root) -print([i for i in range(10)]) \ No newline at end of file diff --git a/Graphs/UnionFind/DisjointSet/05_optimized_disjoint.py b/Graphs/UnionFind/DisjointSet/05_optimized_disjoint.py deleted file mode 100644 index a177cc5d..00000000 --- a/Graphs/UnionFind/DisjointSet/05_optimized_disjoint.py +++ /dev/null @@ -1,44 +0,0 @@ -# Optimized union find program that implements union by rank - -class UnionFind: - def __init__(self, size): - self.root = [i for i in range(size)] - self.rank = [1] * size - - # Recurrsively update root - def find(self, n): - if self.root[n] != n: - self.root[n] = self.find(self.root[n]) - return self.root[n] - - def union(self, a, b): - fa = self.find(a) - fb = self.find(b) - - if fa != fb: - if self.rank[fa] > self.rank[fb]: - self.root[fb] = fa - elif self.rank[fa] < self.rank[fb]: - self.root[fa] = fb - else: - self.root[fa] = fb - self.rank[fb] += 1 - - def connected(self, x, y): - return self.find(x) == self.find(y) - -# Test Case -uf = UnionFind(10) -# 1-2-5-6-7 3-8-9 4 -uf.union(1, 2) -uf.union(2, 5) -uf.union(5, 6) -uf.union(6, 7) -uf.union(3, 8) -uf.union(8, 9) -print(uf.connected(1, 5)) # true -print(uf.connected(5, 7)) # true -print(uf.connected(4, 9)) # false -# 1-2-5-6-7 3-8-9-4 -uf.union(9, 4) -print(uf.connected(4, 9)) # true \ No newline at end of file diff --git a/Graphs/UnionFind/DisjointSet/README.md b/Graphs/UnionFind/DisjointSet/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/Graphs/UnionFind/Images/basic_union/basic_union.png b/Graphs/UnionFind/Images/basic_union/basic_union.png new file mode 100644 index 0000000000000000000000000000000000000000..3346cca759bb6a4fcf1260c1fc39a97692c3228c GIT binary patch literal 26473 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 ciH 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

J`L_MPJ-<*{{K*a8 RuYg4agQu&X%Q~loCIF~{M%n-X literal 0 HcmV?d00001 diff --git a/Graphs/UnionFind/Images/basic_union/basic_union_2.png b/Graphs/UnionFind/Images/basic_union/basic_union_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d4dbeffd2f9016e1f4c5da219da624ef1ea3ccf6 GIT binary patch literal 25677 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 uCP2(1oA literal 0 HcmV?d00001 diff --git a/Graphs/UnionFind/README.md b/Graphs/UnionFind/README.md new file mode 100644 index 00000000..780b485c --- /dev/null +++ b/Graphs/UnionFind/README.md @@ -0,0 +1,86 @@ +## Overview: +A way that we can easily check membership in an undirected graph is through the use of UnionFind aka. Disjoint Set. +The word Union Find and Disjoint Set are relatively interchangable within the coding world with Disjoint Set reffering to +the data structure and Union Find referring to the actual algorithm. This data structure plays an especially important role in Kruskal's algorithm for finding a minimum spanning tree as it can +help determine if an undirected graph contains any cycles. + +## What is a Disjoint Set (Union Find)? +A Disjoint set is essentially an undirected graph. It's a datastructure that stores a collection of disjoint (non-overlapping) sets. +It stores a subsection of a set into disjoint subsets. +The basic operations are as follows: + +### Find() +Find the root of a given disjoint subset + +```python + def find(self, a): + while a != self.root[a]: + a = self.root[a] + return a +``` + +### Union() +Combine subsets into a larger subset +```python + def union(self, x, y): + rootX = self.find(x) + rootY = self.find(y) + if rootX != rootY: + for i in range(len(self.root)): + if self.root[i] == rootY: + self.root[i] = rootX +``` + +At the initialization of a disjoint set each element represents a separate subset with its parent being the element itself. + +This is what's called the root array. + + +## Algorithm of UnionFind in Python +Every time we reach a new node, we will take the following steps: +1. Call find(x), and find(y) to find the root of each of the subsets, with x and y representing the elements to combine. +2. Loop through entire root array and update the root of y with the root of x + +## Time & Space Complexity +* **Time Complexity:** +Time complexity of the basic UnionFind algorithm is `O(N)`, for find and `O(N)` for union, where N is the number of elements + +However, depending on the uitilization of this algorithm it often can scale to `O(N^2)` as you often times find yourself doing +N operations of Union. + + +* **Space Complexity:** +Since the initialization array is of length N. + +The space complexity of the UnionFind algorithm is `O(N)`, where N is the number of elements + +## Input & Output: + +At the start each element is the root of itself. +```python +uf = UnionFind(6) + ``` + + +```python +uf.union(0,1) + ``` +When we call the union function we update the root of one element to the root of the other. + + + +```python +uf.union(4,5) + ``` + + + + +```python +uf.union(1,4) + ``` + + This also applies to all subsequent elements with the same root + + +