Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision | |||
| efinf:blc2016:loesungen-2016-12-13:schraubensack [2016/12/18 09:10] – Ivo Blöchliger | efinf:blc2016:loesungen-2016-12-13:schraubensack [2016/12/18 09:14] (current) – [Mit Hash] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | {{backlinks> | ||
| + | ===== Daten ===== | ||
| + | Aufgabenstellung: | ||
| + | * Anzahl Zeilen in der Datei: $n$ | ||
| + | * Kleinster und grösster Druchmesser: | ||
| + | * Anzahl verschiedene Durchmesser: | ||
| + | |||
| + | ==== $O(f(n))$ Notation ==== | ||
| + | Eine Funktion $g(n)$ ist in $O(f(n))$ wenn es ein $n_0$ und $c_0$ gibt, so dass | ||
| + | $$ g(n) < c_0 f(n) \qquad \forall n>n_0$$ | ||
| + | Umgangssprachlich heisst das, die Funktion $g(n)$ wächst nicht schneller als $f(n)$. | ||
| + | |||
| + | Beispiel: | ||
| + | * Wenn $n$ Personen alle miteinander anstossen, macht es $O(n^2)$ mal " | ||
| + | |||
| + | ==== Sortieren, zählen ==== | ||
| + | Rechenaufwand: | ||
| + | * Sortieren $O(n \log(n))$ (naive Sortier-Algorithmen sind $O(n^2)$). | ||
| + | * Liste durchgehen $O(n)$ | ||
| + | |||
| + | Insgesamt also $O(n \log(n))$. | ||
| + | |||
| + | Speicherplatz: | ||
| + | |||
| + | ==== Durchmesser sequentiell durchgehen, Liste danach absuchen ==== | ||
| + | Rechenaufwand: | ||
| + | * (D-d) mal $n$ Einträge absuchen, also $O((D-d)\cdot n)$ | ||
| + | |||
| + | Speicherplat: | ||
| + | |||
| + | ==== Nur vorhandene Durchmesser durchgehen ==== | ||
| + | Rechenaufwand: | ||
| + | * Nächsten Durchmesser finden: | ||
| + | * Entweder Liste durchgehen, nächst-grösseren finden, also $O(n)$ pro Schritt. | ||
| + | * Oder in der Liste weitersuchen, | ||
| + | * Liste durchgehen, zählen: $O(n)$. Und das ganze $a$ mal. | ||
| + | Also total $O(a\cdot n \cdot n)$ = $O(n^2 a) \subset O(n^3)$ für die erste Variante. | ||
| + | |||
| + | Oder $O(a\cdot n + n) = O(a \cdot n) \subset O(n^2)$ für die zweite Variante. | ||
| + | |||
| + | Speicherplatz: | ||
| + | |||
| + | ==== Mit Hash ==== | ||
| + | Rechenaufwand: | ||
| + | * Für jede Zeile, entsprechenden Eintrag finden: Wenn der Hash gut implementiert ist, $O(\log(a))$. | ||
| + | Also total $O(n \log(a)) \subset O(n \log(n))$. | ||
| + | |||
| + | Speicherplatz: | ||
| + | |||
| + | <code ruby schraubenback-bloechliger-mit-hash.rb> | ||
| + | # | ||
| + | data = Hash.new | ||
| + | File.open(" | ||
| + | | ||
| + | was = line[0] == " | ||
| + | d = line[2..-1].to_i | ||
| + | | ||
| + | data[d] = [0,0] | ||
| + | end | ||
| + | | ||
| + | end | ||
| + | } | ||
| + | # Der folgende Sort ist O(a log(a)), was weniger | ||
| + | # als O(a log(a)) der obigen Schlaufe ist. | ||
| + | data.keys.sort.each{|d| | ||
| + | puts "# | ||
| + | } | ||
| + | </ | ||