Pascal Schärli 27.11.2020
Pascal Schärli 27.11.2020
Pascal Schärli 27.11.2020
Pascal Schärli 27.11.2020
Pascal Schärli 27.11.2020
Pascal Schärli 27.11.2020
Turm 1
Turm 2
Turm 3
Pascal Schärli 27.11.2020
\(n = 4\)
Turm 1
Turm 3
Turm 2
[1]
[2]
[3]
[4]
Pascal Schärli 27.11.2020
\(n = 4\)
Turm 1
Turm 3
Turm 2
[1]
[2]
[3]
[4]
Pascal Schärli 27.11.2020
\(n = 4\)
Turm 1
Turm 3
Turm 2
[1]
[2]
[3]
[4]
Pascal Schärli 27.11.2020
\(n = 4\)
Turm 1
Turm 3
Turm 2
[1]
[2]
[3]
[4]
Dies können wir in einem Rekursiven Algorithmus festhalten:
hanoi(int n, int von, int nach){
if(n == 1) movetop(von,nach);
int other = 6 - von - nach;
hanoi(n-1,von,other); // [2]
movetop(von,nach); // [3]
hanoi(n-1,other,nach); // [4]
}
Pascal Schärli 27.11.2020
Mergesort ist ein Sortieralgorithmus, welcher ebenfalls durch divide and conquer funktioniert
Â
3
8
6
5
2
7
4
1
1
2
3
4
5
6
7
8
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
1
2
3
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
1
2
3
4
5
6
7
8
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
1
2
3
Pascal Schärli 27.11.2020
1
2
4
7
ptr1
ptr2
3
8
6
5
1
2
4
7
3
8
6
5
Um zwei Listen zu Mergen kann man:
Â
• einen Zeiger auf den Anfang von beiden Teillisten setzen
• Das kleinere Element dem Resultat hinzufügen und diesen Zeiger vergrössern
Pascal Schärli 27.11.2020
1
2
4
7
ptr1
ptr2
3
8
6
5
1
2
4
7
3
8
6
5
Um zwei Listen zu Mergen kann man:
Â
• einen Zeiger auf den Anfang von beiden Teillisten setzen
• Das kleinere Element dem Resultat hinzufügen und diesen Zeiger vergrössern
Pascal Schärli 27.11.2020
1
2
4
7
ptr1
ptr2
3
8
6
5
1
2
4
7
3
8
6
5
Um zwei Listen zu Mergen kann man:
Â
• einen Zeiger auf den Anfang von beiden Teillisten setzen
• Das kleinere Element dem Resultat hinzufügen und diesen Zeiger vergrössern
Pascal Schärli 27.11.2020
1
2
4
7
ptr1
ptr2
3
8
6
5
1
2
4
7
3
8
6
5
Um zwei Listen zu Mergen kann man:
Â
• einen Zeiger auf den Anfang von beiden Teillisten setzen
• Das kleinere Element dem Resultat hinzufügen und diesen Zeiger vergrössern
Pascal Schärli 27.11.2020
1
2
4
7
ptr1
ptr2
3
8
6
5
1
2
4
7
3
8
6
5
Um zwei Listen zu Mergen kann man:
Â
• einen Zeiger auf den Anfang von beiden Teillisten setzen
• Das kleinere Element dem Resultat hinzufügen und diesen Zeiger vergrössern
Pascal Schärli 27.11.2020
1
2
4
7
ptr1
ptr2
3
8
6
5
1
2
4
7
3
8
6
5
Um zwei Listen zu Mergen kann man:
Â
• einen Zeiger auf den Anfang von beiden Teillisten setzen
• Das kleinere Element dem Resultat hinzufügen und diesen Zeiger vergrössern
Pascal Schärli 27.11.2020
1
2
4
7
ptr1
ptr2
3
8
6
5
1
2
4
7
3
8
6
5
Um zwei Listen zu Mergen kann man:
Â
• einen Zeiger auf den Anfang von beiden Teillisten setzen
• Das kleinere Element dem Resultat hinzufügen und diesen Zeiger vergrössern
Pascal Schärli 27.11.2020
1
2
4
7
ptr1
ptr2
3
8
6
5
1
2
4
7
3
8
6
5
Um zwei Listen zu Mergen kann man:
Â
• einen Zeiger auf den Anfang von beiden Teillisten setzen
• Das kleinere Element dem Resultat hinzufügen und diesen Zeiger vergrössern
Pascal Schärli 27.11.2020
1
2
4
7
ptr1
ptr2
3
8
6
5
1
2
4
7
3
8
6
5
Um zwei Listen zu Mergen kann man:
Â
• einen Zeiger auf den Anfang von beiden Teillisten setzen
• Das kleinere Element dem Resultat hinzufügen und diesen Zeiger vergrössern
Pascal Schärli 27.11.2020
1
2
4
7
ptr1
ptr2
3
8
6
5
1
2
4
7
3
8
6
5
Um zwei Listen zu Mergen kann man:
Â
• einen Zeiger auf den Anfang von beiden Teillisten setzen
• Das kleinere Element dem Resultat hinzufügen und diesen Zeiger vergrössern
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
5
6
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
5
6
3
5
6
8
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
5
6
3
5
6
8
2
7
4
1
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
5
6
3
5
6
8
2
7
4
1
2
7
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
5
6
3
5
6
8
2
7
4
1
2
7
2
7
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
5
6
3
5
6
8
2
7
4
1
2
7
2
7
4
1
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
5
6
3
5
6
8
2
7
4
1
2
7
2
7
4
1
1
4
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
5
6
3
5
6
8
2
7
4
1
2
7
2
7
4
1
1
4
1
2
4
7
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
5
6
3
5
6
8
2
7
4
1
2
7
2
7
4
1
1
4
1
2
4
7
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
5
6
3
5
6
8
2
7
4
1
2
7
2
7
4
1
1
4
1
2
4
7
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
3
8
6
5
3
8
3
8
6
5
5
6
3
5
6
8
2
7
4
1
2
7
2
7
4
1
1
4
1
2
4
7
3
8
6
5
2
7
4
1
3
8
6
5
2
7
4
1
Pascal Schärli 27.11.2020
Pascal Schärli 27.11.2020
\(\frac{1}{2^{n!}} + 10 + n^2 + 3*n^5\)
\(O(n^5)\)
\(\frac{1}{7}(n! + 2^n + n^2)\)
\(O(n!)\)
\(log(n) + n*log_3(n)\)
\(O(n*log(n))\)
\(2^{n + 5}\)
\(O(2^n)\)
\(\frac{n}{n + 5}\)
\(O(1)\)
Pascal Schärli 27.11.2020
\(T(n) \approx 2^1 \cdot T(\frac{n}{2^1}) + n\)
\(T(n) \approx 2^1 \cdot (2 \cdot T(\frac{n}{2^2}) + \frac{n}{2}) + n\)
\(T(n) \approx 2^2 \cdot T(\frac{n}{2^2}) + 2 \cdot n\)
\(T(n) \approx 2^3 \cdot T(\frac{n}{2^3}) + 3 \cdot n\)
\(T(n) \approx 2^4 \cdot T(\frac{n}{2^4}) + 4 \cdot n\)
\(\cdots\)
\(T(n) \approx 2^{log_2(n)} \cdot T(1) + log_2(n) \cdot n\)
\(T(n) \approx n \cdot T(1) + log_2(n) \cdot n\)
\(\Rightarrow\) Laufzeitkomplexität von Mergesort: \(O(n \cdot log(n))\)
Pascal Schärli 27.11.2020
Pascal Schärli 27.11.2020
Pascal Schärli 27.11.2020
Pascal Schärli 27.11.2020
Erstellt eine Hilfsfunktion, welche den Array in einem Bestimmten Intervall [begin, end) sortiert
Macht Messungen um zu schauen ob die Ausführungszeit wirklich Logarithmisch steigt
public static void main(String[] args) {
int counts[] = {100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400};
for (int count : counts) {
double result = measure(count);
System.out.println(String.format("%d: %.2f ms", count, result));
}
}
Pascal Schärli 27.11.2020
#!/usr/bin/python3
from matplotlib import pyplot as plt
import random
if __name__ == "__main__":
counts = [100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200]
# TODO: Replace line below with your measurements:
times = [random.random()*c for c in counts]
# Set title and axis labels
plt.title("Mergesort Time measurements")
plt.xlabel("Input size")
plt.ylabel("Time [s]")
# Set axis scale to log-log plot
plt.xscale("log")
plt.yscale("log")
# Plot our data on the plot
plt.plot(counts, times, color="black")
# Save an image of the plot to plot.png
plt.savefig("plot.png")
# Show the resulting plot
plt.show()
Tipp: Die coolen Kids heutzutage benutzen Python mit Matplotlib
(not sponsored)
Pascal Schärli 27.11.2020
Pascal Schärli 27.11.2020
Pascal Schärli 27.11.2020
Pascal Schärli 27.11.2020