summaryrefslogtreecommitdiff
path: root/datastructures
diff options
context:
space:
mode:
Diffstat (limited to 'datastructures')
-rw-r--r--datastructures/datastructures.tex2
-rw-r--r--datastructures/segmentTree.cpp5
-rw-r--r--datastructures/unionFind.cpp16
3 files changed, 15 insertions, 8 deletions
diff --git a/datastructures/datastructures.tex b/datastructures/datastructures.tex
index 4f9ad04..7edb390 100644
--- a/datastructures/datastructures.tex
+++ b/datastructures/datastructures.tex
@@ -5,6 +5,8 @@
\subsection{Segmentbaum}
\lstinputlisting{datastructures/segmentTree.cpp}
+\lstinline{update()} kann so umgeschrieben werden, dass ganze Intervalle geändert werden.
+Dazu muss ein Offset in den inneren Knoten des Baums gespeichert werden.
\subsection{Range Minimum Query}
\lstinputlisting{datastructures/RMQ.cpp}
diff --git a/datastructures/segmentTree.cpp b/datastructures/segmentTree.cpp
index 14973fe..93a2ceb 100644
--- a/datastructures/segmentTree.cpp
+++ b/datastructures/segmentTree.cpp
@@ -1,8 +1,10 @@
+// Laufzeit: init: O(n), query: O(log n), update: O(log n)
+// Berechnet das Maximum im Array.
int a[MAX_N], m[4 * MAX_N];
int query(int x, int y, int k = 0, int X = 0, int Y = MAX_N - 1) {
if (x <= X && Y <= y) return m[k];
- if (y < X || Y < x) return -1000000000; //ein "neutrales" Element
+ if (y < X || Y < x) return -1000000000; // Ein "neutrales" Element.
int M = (X + Y) / 2;
return max(query(x, y, 2 * k + 1, X, M), query(x, y, 2 * k + 2, M + 1, Y));
}
@@ -20,6 +22,7 @@ void update(int i, int v, int k = 0, int X = 0, int Y = MAX_N - 1) {
m[k] = max(m[2 * k + 1], m[2 * k + 2]);
}
+// Einmal vor allen anderen Operationen aufrufen.
void init(int k = 0, int X = 0, int Y = MAX_N - 1) {
if (X == Y) {
m[k] = a[X];
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));
}