summaryrefslogtreecommitdiff
path: root/datastructures/unionFind.cpp
diff options
context:
space:
mode:
authorPaul Jungeblut <paul.jungeblut@gmail.com>2015-12-02 19:57:02 +0100
committerPaul Jungeblut <paul.jungeblut@gmail.com>2015-12-02 19:57:02 +0100
commitb9e7427d720b489fa8d712a0ab6e8baa1dcca6be (patch)
treec61b6e3a603d4a65536cf4e1e1f8574877ed8295 /datastructures/unionFind.cpp
parentaab58bfc13a11f1a8e6161d3a3750f1547d5d896 (diff)
Improvements in datastructures chapter.
Diffstat (limited to 'datastructures/unionFind.cpp')
-rw-r--r--datastructures/unionFind.cpp16
1 files changed, 9 insertions, 7 deletions
diff --git a/datastructures/unionFind.cpp b/datastructures/unionFind.cpp
index 1ee532c..4b13dbf 100644
--- a/datastructures/unionFind.cpp
+++ b/datastructures/unionFind.cpp
@@ -1,19 +1,21 @@
-vector<int> parent, rank2; //manche Compiler verbieten Variable mit Namen rank
+// Laufzeit: O(n*alpha(n))
+// "size" ist obere Schranke für die Höhe der Bäume.
+vector<int> parent, size;
-int findSet(int n) { //Pfadkompression
+int findSet(int n) { // Pfadkompression
if (parent[n] != n) parent[n] = findSet(parent[n]);
return parent[n];
}
-void linkSets(int a, int b) { //union by rank
- if (rank2[a] < rank2[b]) parent[a] = b;
- else if (rank2[b] < rank2[a]) parent[b] = a;
+void linkSets(int a, int b) { // Union by rank.
+ if (size[a] < size[b]) parent[a] = b;
+ else if (size[b] < size[a]) parent[b] = a;
else {
parent[a] = b;
- rank2[b]++;
+ size[b]++;
}
}
-void unionSets(int a, int b) {
+void unionSets(int a, int b) { // Diese Funktion aufrufen.
if (findSet(a) != findSet(b)) linkSets(findSet(a), findSet(b));
}