Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| gf_informatik:suchen_und_sortieren [2025-10-03 06:25] – [Aufgabe A3: Zäh Millione Kombinatione] hof | gf_informatik:suchen_und_sortieren [2026-02-24 07:33] (aktuell) – [Aufgabe A3: Zäh Millione Kombinatione] hof | ||
|---|---|---|---|
| Zeile 4: | Zeile 4: | ||
| Direkt zu [[gf_informatik: | Direkt zu [[gf_informatik: | ||
| + | |||
| + | ++++Lernziele lineare und binäre Suche:| | ||
| + | * Ich kann erklären, wie die lineare Suche und wie die binäre Suche funktioniert. | ||
| + | * Ich kann die beiden Such-Algorithmen (linear und binär) miteinander vergleichen, | ||
| + | * Ich kann für eine gegebene Anzahl Einträge (Listen-Länge) die maximale Anzahl Abfragen für beide Such-Algorithmen berechnen. | ||
| + | * Ich kann eine Funktion '' | ||
| + | * Ich kann eine Funktion '' | ||
| + | * Ich kann Suchfunktionen (linear und binär) verwenden, um in mehreren zusammenpassenden Listen zusammengehörende Elemente zu finden – Beispiel: | ||
| + | ++++ | ||
| + | |||
| ==== Einführung ==== | ==== Einführung ==== | ||
| Zeile 32: | Zeile 42: | ||
| 1. Wie lange dauerte die Suche, wenn wir nicht einmal die Vorwahl kennen würden (aber wüssten, dass alle Nummern mit `0` beginnen)? | 1. Wie lange dauerte die Suche, wenn wir nicht einmal die Vorwahl kennen würden (aber wüssten, dass alle Nummern mit `0` beginnen)? | ||
| - | < | + | < |
| ++++Lösung| | ++++Lösung| | ||
| Zeile 45: | Zeile 55: | ||
| === Algorithmus === | === Algorithmus === | ||
| - | Der einfachste Such-Algorithmus probiert alle Telefonnummern von der kleinsten zur grössten durch. Die Zeit für die Suche steigt proportional mit der Anzahl möglichen Nummern an - wir sagen auch, dass die Zeit **linear** mit der Grösse des Suchbereichs wächst, und sprechen von **Linearer Suche**. | + | Der einfachste Such-Algorithmus probiert alle Telefonnummern von der kleinsten zur grössten durch. Die Zeit für die Suche steigt |
| Würden wir statt _079_ nicht einmal die Vorwahl kennen, wäre die Suche nochmals zwei Dezimalstellen länger (wenn alle Telefonnummern mit 0 beginnen). Wir müssten also statt 6.5 sogar über 600 Jahre suchen. | Würden wir statt _079_ nicht einmal die Vorwahl kennen, wäre die Suche nochmals zwei Dezimalstellen länger (wenn alle Telefonnummern mit 0 beginnen). Wir müssten also statt 6.5 sogar über 600 Jahre suchen. | ||
| Zeile 56: | Zeile 66: | ||
| Betrachte folgenden Datensatz mit Namen und Telefonnummern. Wir haben zwei parallele Listen, die erste mit Namen, die zweite mit den dazugehörigen Telefonnummern. Am gleichen Index ist in der ersten Liste der Name, in der zweiten die Telefonnummer gespeichert. | Betrachte folgenden Datensatz mit Namen und Telefonnummern. Wir haben zwei parallele Listen, die erste mit Namen, die zweite mit den dazugehörigen Telefonnummern. Am gleichen Index ist in der ersten Liste der Name, in der zweiten die Telefonnummer gespeichert. | ||
| - | Zum Beispiel finden für den Index `1` Anela in `names[1]` und ihre Nummer 0790000001 in `numbers[1]`. | + | Zum Beispiel finden |
| <code python lineare_suche.py> | <code python lineare_suche.py> | ||
| Zeile 63: | Zeile 73: | ||
| ' | ' | ||
| ' | ' | ||
| - | numbers = [' | + | numbers = [' |
| ' | ' | ||
| ' | ' | ||
| Zeile 75: | Zeile 85: | ||
| ++++Tipps (zuerst ohne Tipps versuchen!)| | ++++Tipps (zuerst ohne Tipps versuchen!)| | ||
| - | - Gehe IN der Funktion die Liste `l` alle möglichen Indices (Positionen) durch. | + | - Gehe IN der Funktion die Liste `l` alle möglichen Indices (Positionen) durch ([[gf_informatik: |
| - | - Vergleiche das Element an jedem Index mit dem gesuchten Wert `v`. | + | - Vergleiche das Element an jedem Index (also `l[index]`) |
| - Wenn es gleich ist: Gib den Index zurück. | - Wenn es gleich ist: Gib den Index zurück. | ||
| - Ausserhalb der Funktion: Lese nun aus der **anderen** Liste das Element mit dem eben ermittelten Index aus. | - Ausserhalb der Funktion: Lese nun aus der **anderen** Liste das Element mit dem eben ermittelten Index aus. | ||
| Zeile 82: | Zeile 92: | ||
| - | < | + | < |
| ++++Lösung| | ++++Lösung| | ||
| <code python> | <code python> | ||
| Zeile 108: | Zeile 118: | ||
| Damit das funktioniert, | Damit das funktioniert, | ||
| - | == Mit WebtigerPython | + | == Mit WebTigerPython |
| - | Am einfachsten geht das mit [https:// | + | Am einfachsten geht das mit [[https:// |
| - | == Mit TigerPython | + | ++++ Mit TigerPython |
| Lade die Datei [[https:// | Lade die Datei [[https:// | ||
| Zeile 119: | Zeile 129: | ||
| from null79 import names, numbers | from null79 import names, numbers | ||
| - | index = 42 | + | index = 42 # TODO: Suche den Index von Lyanna! |
| name = names[index] | name = names[index] | ||
| telnr = numbers[index] | telnr = numbers[index] | ||
| - | print("Die Telefonnummer von " + name + " | + | print(f'Die Telefonnummer von {name} ist {telnr}') |
| </ | </ | ||
| + | ++++ | ||
| == Aufgabe == | == Aufgabe == | ||
| Verwende deine `linear_search()` Funktion, um die richtige Telefonnummer von Lyanna herauszufinden. Wie lange dauert die Suche? | Verwende deine `linear_search()` Funktion, um die richtige Telefonnummer von Lyanna herauszufinden. Wie lange dauert die Suche? | ||
| - | < | + | < |
| ++++Lösung mit Code| | ++++Lösung mit Code| | ||
| <code python Aufgabe A3.py> | <code python Aufgabe A3.py> | ||
| Zeile 141: | Zeile 151: | ||
| name = ' | name = ' | ||
| - | idx = linear_search(names, | + | index = linear_search(names, |
| - | if idx == None: | + | if index == None: |
| print(" | print(" | ||
| else: | else: | ||
| - | tel = numbers[idx] | + | tel = numbers[index] |
| - | print("Die Telefonnummer von " + name + " | + | print(f'Die Telefonnummer von {name} ist {telnr}' |
| print(" | print(" | ||
| print(" | print(" | ||
| Zeile 158: | Zeile 168: | ||
| Wir möchten genau wissen, wie lange die Suche dauert, auch wenn es hoffentlich nicht 6.5 Jahre sind. | Wir möchten genau wissen, wie lange die Suche dauert, auch wenn es hoffentlich nicht 6.5 Jahre sind. | ||
| - | Um in Python die Zeit zu stoppen, kannst du das `time` Modul verwenden. Wie lange dauert die Suche für die `Lyanna`? Wie lange für `Annina`? Weshalb der Unterschied? | + | Um in Python die Zeit zu stoppen, kannst du das `time` Modul verwenden. Wie lange dauert die Suche für die `Lyanna`? Wie lange für `Annina` oder `Zoraya`? Weshalb der Unterschied? |
| <code python> | <code python> | ||
| import time | import time | ||
| + | # Startzeitpunkt bestimmen | ||
| start = time.time() | start = time.time() | ||
| - | # do something | + | |
| + | # TODO: Hier muss die Suche passieren | ||
| + | |||
| + | # Endzeitpunkt bestimmen und Differenz zum Start berechnen | ||
| elapsed = time.time() - start | elapsed = time.time() - start | ||
| - | print("do something took " + str(elapsed) + "s") | + | # Ausgabe - das ': |
| + | print(f' | ||
| </ | </ | ||
| - | < | + | < |
| ++++Lösung| | ++++Lösung| | ||
| <code python time_algos.py> | <code python time_algos.py> | ||
| from null79 import names, numbers | from null79 import names, numbers | ||
| import time | import time | ||
| + | |||
| def linear_search(l, | def linear_search(l, | ||
| for i in range(len(l)): | for i in range(len(l)): | ||
| Zeile 179: | Zeile 194: | ||
| return i | return i | ||
| return None | return None | ||
| + | |||
| def stopwatch(name): | def stopwatch(name): | ||
| start = time.time() | start = time.time() | ||
| index = linear_search(names, | index = linear_search(names, | ||
| elapsed = time.time() - start | elapsed = time.time() - start | ||
| - | print("Lineare Suche für {0} dauerte {1:.1f}s" | + | print(f'Lineare Suche für {name} dauerte {elapsed:.1f}s') |
| + | |||
| + | stopwatch(' | ||
| stopwatch(' | stopwatch(' | ||
| - | stopwatch(' | + | stopwatch(' |
| </ | </ | ||
| ++++ | ++++ | ||
| Zeile 199: | Zeile 215: | ||
| ++++ | ++++ | ||
| - | < | + | < |
| ++++Code| | ++++Code| | ||
| <code python> | <code python> | ||
| Zeile 228: | Zeile 244: | ||
| * Ist die Liste sortiert, soll die Suche abbrechen, wenn wir im Alphabet bereits weiter sind als der gesuchte Wert. | * Ist die Liste sortiert, soll die Suche abbrechen, wenn wir im Alphabet bereits weiter sind als der gesuchte Wert. | ||
| - | < | + | < |
| ++++Lösung| | ++++Lösung| | ||
| <code python> | <code python> | ||