Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
gf_informatik:suchen_und_sortieren:binaersuche [2026-04-04 20:13] – [Aufgabe B5: Zeitmessung mit linearer und binärer Suche] hofgf_informatik:suchen_und_sortieren:binaersuche [2026-05-02 12:30] (aktuell) – [Aufgabe B8: Rekursion (optional)] hof
Zeile 2: Zeile 2:
  
 Weiter zu [[gf_informatik:suchen_und_sortieren:sortieren|Sortieren]] Weiter zu [[gf_informatik:suchen_und_sortieren:sortieren|Sortieren]]
- 
-<html><script type="module" src="https://bottom.ch/editor/stable/bottom-editor.js"></script></html> 
  
 <blockquote>Fast is better than slow. <blockquote>Fast is better than slow.
Zeile 78: Zeile 76:
 </nodisp> </nodisp>
  
-<code python binaere_suche.py>+<bottom-exercise id="b3" timeout="5" showsolution> 
 +<template data-type="starter">
 def binary_search(l, v): def binary_search(l, v):
     """Gibt den Index des gesuchten Elements in l zurück, None,     """Gibt den Index des gesuchten Elements in l zurück, None,
Zeile 89: Zeile 88:
     return None     return None
  
-TEST YOUR FUNCTION +Test
-print(binary_search(['A','C','D','G','J','N','Q','X'],'B')) # output must be: None +
-print(binary_search(['A','C','D','G','J','N','Q','X'],'A')) # output must be: 0 +
-print(binary_search(['A','C','D','G','J','N','Q','X'],'C')) # output must be: 1 +
-print(binary_search(['A','C','D','G','J','N','Q','X'],'D')) # output must be: 2 +
-print(binary_search(['A','C','D','G','J','N','Q','X'],'G')) # output must be: 3+
 print(binary_search(['A','C','D','G','J','N','Q','X'],'J')) # output must be: 4 print(binary_search(['A','C','D','G','J','N','Q','X'],'J')) # output must be: 4
-print(binary_search(['A','C','D','G','J','N','Q','X'],'N')) # output must be: 5 +</template
-print(binary_search(['A','C','D','G','J','N','Q','X'],'Q')) # output must be: 6 +<template data-type="solution">
-print(binary_search(['A','C','D','G','J','N','Q','X'],'X')) # output must be: 7 +
-print(binary_search(['A','C','D','G','J','N','Q','X'],'Z')) # output must be: None +
-</code> +
- +
-<nodisp 1> +
-++++Lösung| +
-<code python binaere_suche_loesung.py>+
 def binary_search(l, v): def binary_search(l, v):
-    """Gibt den Index des gesuchten Elements in l zurück, None, 
-       wenn das Element nicht existiert.""" 
     links = 0     links = 0
     rechts = len(l) - 1     rechts = len(l) - 1
 +    
     while links <= rechts:     while links <= rechts:
         mitte = (links + rechts) // 2         mitte = (links + rechts) // 2
-        if l[mitte] == v: +        element = l[mitte] 
-            return mitte +        print(f'Besuche {mitte} ({element}) im Intervall {links}-{rechts}'
-        elif l[mitte] > v:+        if element == v: 
 +            return mitte  # Gefunden! 
 +        if < element: 
 +            # Links weitersuchen
             rechts = mitte - 1             rechts = mitte - 1
         else:         else:
 +            # Rechts weitersuchen
             links = mitte + 1             links = mitte + 1
-    return None +             
-</code+    return None  # Nichts gefunden 
-++++ + 
-</nodisp>+print(binary_search(['A','C','D','G','J','N','Q','X'],'J')) # output must be: 4 
 +</template
 +<template data-type="test"> 
 +assert binary_search(['A','C','D','G','J','N','Q','X'],'B') is None 
 +assert binary_search(['A','C','D','G','J','N','Q','X'],'A') == 0 
 +assert binary_search(['A','C','D','G','J','N','Q','X'],'C') == 1 
 +assert binary_search(['A','C','D','G','J','N','Q','X'],'D') == 2 
 +assert binary_search(['A','C','D','G','J','N','Q','X'],'G') == 3 
 +assert binary_search(['A','C','D','G','J','N','Q','X'],'J') == 4 
 +assert binary_search(['A','C','D','G','J','N','Q','X'],'N') == 5 
 +assert binary_search(['A','C','D','G','J','N','Q','X'],'Q') == 6 
 +assert binary_search(['A','C','D','G','J','N','Q','X'],'X') == 7 
 +assert binary_search(['A','C','D','G','J','N','Q','X'],'Z') is None 
 +</template> 
 +</bottom-exercise>
  
 #### Aufgabe B4: Binäre Suche für 079 #### Aufgabe B4: Binäre Suche für 079
-Kannst du nun die Funktion für die binäre Suche selbständig, also __möglichst ohne nachschauen__ schreiben und diese auch verwenden, um in Listen zu suchen? Versuche es: 
  
-  Öffne [[https://wtp.ethz.ch/#?code=NobwRAdghgtgpmAXGANgezQBwHSYJ5gA0YAJlAC5RJgCMADAEyE00AszLzdAnIQMxMW7FgHYOdcVxod2ArgFYuvFoM5COANn6C6Y-ovoAOLse6LueusaOEzm23poHdHRXPpdLz61dvnLPqYGNFoWrp7hrBKsNGAAvoTg0PDUMFAAlhC4BMRklNQAZgBOaDAABBAArigoItxl6TCYaEXkFbBwAM6EFZUwAEZwRZ0AOhBlY5kkcAAeZQC8ZawMZWUAxGUAKgDyACLbiGUAypUAxgAWcGXT4wCSENNzAG5o4wAyeFAQ0ACEY8lXRYAzrAKazAC6Y3IcBQECKC16AyGILBM0hEEwRUy5AAFAUAOS7dJXTYwuAFV5VGDweEvcYgAFxBqdNogaGwopxfEASniiUgHWoVRqdWyRFIFCoyDWPwA9JVOkVZf1MrL8ORzq8xhsALQAKh1ZVOaBImQA5odKuQCoYyvqdZMmi02uRGnAeiysRAzT00hqxmNTigoJ1OsdMFBhnAAAqaiBwABCGAA1jjuYgxqtViMwDmcwBBMqdCNRsoodIssoaihlIpwciVIoQMMaq51p7IuAkBo3V3kPBlCnwqBlM3pDvjVE9THk9IzLtlADu6X94yzWZHM4Kc-wedzubXq2mBTKAH1T5kV-ecZ0YQVp3XtzN5jndNwc-nM-us7eUAVsKeKBwN6GoIvQdAQZBX7fkWd4AVuc4IghMwBoe1zkmegHAdev4FJ-aHrnWDZNrBf4AUBIHnKh67HphZr1iucAwDhd49Ok-Ewas6Qnv2mBwDi7HMhUaBtNiGYEZxRQZLeZT3I8ACiRQlEUOI5vcTxQOW3aoocOZlAA1EW5Aqex3LQd-3ENGUAA8ZR0OJnEWQZiwUTed5mRJXEnnQNmLOkNllsBbl_hxjlZkRjbjLh8GPohhlDn6OKubh3J2mUNBpekPSvnphmegJEC4n65zYOgZr0ElQUpdyNUGRMkAfuZhHSVccmzIpymqWAbVzGgVplGgJ5Sd6cC6WAdX5aZqFBiGYZHCWt5vBWuKhdm-4FkWC3umUmmYOcUCDK6pyaSgA6dM6C7lpW1ZtNM0JFDAl4sukx01AOEVNmGUBNasAKDi0ZRwFAFyjuOwENA8sw9LMpxwJgbRDjtsGnERZTJnAeCyhpKCVFcEbpEUu7rQeNEYeel7kCxf49BRZoah6cAo_Wp7o3gDNM5T2O4z00zBng8x0Kt37RaevNQAOixi3gP2rCLtOgS5wF01Rnmkf-p63hzLMYwimtEdr0uqyLevM1zgLI_rZsy2rAEvIuMJhos-JQHA6R9fi1si8azavF85CO2UwAg4jIOZEZXpmtgIanOk6SAWg9tFMdMmWSDEAiRDNunnbDvoo5IskH1_RAQH-L9CQBRmigMAYsM5Ae0bcGnhSNQJ8iusXSQwXqznKBhnlTeF5UxddB55m0eeFFU3hDmSfWkVZ_LKvruPZPxjMlO7fth3dzTIbkEL67BpWLn76VbcqR5jmWcf5DADqNDgpnIu950s9hbW88kV7rzndAhWjFVjfIKt9Uq2QYO_MKH0opN1ftbG--974MCfmHH-Pt_7-0gY5aBWc4GqxwSLFu6BE6AJXmhCe9F4xSWhKeAEu8GiHyzHuHMux6xDEehAZaL0ToDkoUMCgVxWztHgDtUSkM5j-WKKUKslwdoaXSMGEeO0UB7QOvWMogwhxXBNpzTSuMibMIgPAk8_l5iLGNozfWrMsFz2IjAsiGtLGmz0XAYxVlbIWK1tY6264WSRjaIsOgPiszAW7OYpuOiDbBNWFvNRATw7mijp0GOcdKiYD4knEMcBgD2U9Ik6OsdTxpIycnOA2BUTdwApEs2OTwTcjzh_MsCJXKxMOlfTiDtRrRKMv43WESnGU1ZnVGg3TQnNKqu5bprT1HmOMvk5JhTilDFKcAPJ3okkpKKek5ZWTyniMqY4rWNS6B1P0jQRADSP7-R1OEhxkShmGRGUY1WGx5rljaKsygrREChJQYVNATS4AAEdKiaR1J0dIAAvBc2IhjYzDINJGS8BongOn1MR91sayhQNbFA4yIA4mmQfa2YSyjFWwLDBROIcRjMNH41oqVZRlnaTBVECJsQCTKLKJlJAWXfj-osIloJxGXKcn5MoABSa41FOKLnOAoq43YAB86UbEwSJX0hx69N4qO3vWHEAI-WOTxYrAlRKjWcVJeSylKAcTdiZSgC1rLxHssKpy7l1wnX8o6M5ZRqjDrCseKK6-7LJXSvwV_cYAIZVHjJqeeifYmLTzYow1Yrp4DYE6EBOGBypZessrxfigkKzCQxWq78UkKytXER1FoXV1KaXSNpcRY0JrGQEjVNx_lbL2W6f5fSpru75pMQsW56t7kY3LYRSNWdqkuOtgQpufDqFwFoR0DtqEqSDGGAieakZbyxleImFMXU3yNW-B0AOe6oxLRZDicCkEII9D4GYPghhlg9HxB8L40AeTxHBEAA|WebTigerPython mit der bereits hinterlegten Telefonbuch-Datei (null79.py)]]+<bottom-exercise id="b4" timeout="5" zip="https://bottom.ch/ksr/1m/null79.py.zip" showsolution> 
-    - Alternative: Erstelle eine neue, leere Python-Datei und speichere sie (Name z.B.: `aufgabe_b4.py`) im gleichen Ordner wie die Datei `null79.py`. Importiere das Modul `null79`, das du schon in Aufgabe A3 verwendet hast (`from null79 import names, numbers`). +<div slot="prompt"> 
-  - Schreibe selbständig deine Funktion `binary_search(l, v)`: Sie soll die Position von `v` in der Liste `l` zurückgeben. Wenn nichts gefunden wird, soll die Funktion `None` zurückgeben. +Kannst du nun die Funktion für die binäre Suche selbständig, also <em>ohne nachzuschauen</em>schreiben und diese auch verwenden, um in Listen zu suchen? Versuche es:
-  - Definiere unter einer Variable namens `name` den gesuchten Namen, also `Lyanna`. +
-  - Jetzt suchst du mit `index = binary_search(namesname)` nach dem Index von `name` in der Liste `names`. +
-  - Unter dem gleichen Index findest du in `numbers` die dazugehörige Telefonnummer. +
-  - Gib einen Satz im Format `Die Telefonnummer von ... ist ...` aus. +
-  - Dein Code sollte so aufgebaut sein, dass du nur die Variable `name` ändern musst, damit ein neuer, korrekter Satz ausgegeben wird.+
  
-<nodisp 1+<ul
-++++Lösung| +  <li>Schreibe selbständig deine Funktion <code>binary_search(l, v)</code>Sie soll die Position von <code>v</code> in der Liste <code>l</code> zurückgebenWenn nichts gefunden wird, soll die Funktion <code>None</code> zurückgeben. 
-<html><bottom-editor timeout="180" zip="https://sca.ksr.ch/lib/exe/fetch.php?media=gf_informatik:programmieren_i:null79.py.zip">+  <li>Definiere unter einer Variable namens <code>name</code> den gesuchten Namen, also <code>Lyanna</code>. 
 +  <li>Jetzt suchst du mit <code>index = binary_search(names, name)</code> nach dem Index von <code>name</code> in der Liste <code>names</code>. 
 +  <li>Unter dem gleichen Index findest du in <code>numbers</code> die dazugehörige Telefonnummer. 
 +  <li>Gib einen Satz im Format <code>Die Telefonnummer von ... ist ...</code> aus. 
 +  <li>Dein Code sollte so aufgebaut sein, dass du nur die Variable <code>name</code> ändern musst, damit ein neuer, korrekter Satz ausgegeben wird. 
 +</ul> 
 +</div> 
 +<template data-type="starter"> 
 +from null79 import names, numbers 
 + 
 +def binary_search(l, v): 
 +    """Gibt den Index des gesuchten Elements in l zurück, None, 
 +       wenn das Element nicht existiert.""" 
 +</template> 
 +<template data-type="solution">
 from null79 import names, numbers from null79 import names, numbers
  
Zeile 165: Zeile 177:
     telnr = numbers[index]     telnr = numbers[index]
     print('Die Nummer von ' + name + ' lautet ' + telnr + '!')     print('Die Nummer von ' + name + ' lautet ' + telnr + '!')
-</bottom-editor></html> +</template> 
-++++ +<template data-type="test"> 
-</nodisp>+assert binary_search(['A','C','D','G','J','N','Q','X'],'D') == 2 
 +assert binary_search(['A','C','D','G','J','N','Q','X'],'Z') is None 
 +assert binary_search(names,'Lyanna') >= 0 
 +</template
 +</bottom-exercise>
  
 #### Aufgabe B5: Zeitmessung mit linearer und binärer Suche #### Aufgabe B5: Zeitmessung mit linearer und binärer Suche
-Vergleiche die lineare Suche mit der binären Suche. Hierzu kannst du von Aufgabe B4 ausgehen (unter neuem Namen speichern): 
-  - Behalte nur die Listen und die Definition der Funktion `binary_search()`. 
-  - Ergänze die Datei um die Funktion `linear_search(l, v)` (am besten, du schreibst du sie selbst hin, anstatt sie zu kopieren). 
-  - Definiere eine neue Funktion `stopwatch(algo, name)`. Sie hat zwei Argumente: 
-    - `algo` ist der Name der Suchfunktion (Suchalgorithmus), die verwendet werden soll (also `binary_search` oder `linear_search`, ohne die Klammern des Funktionsaufrufs). 
-    - `name` ist der Name, nach dem gesucht werden soll. 
-  - Die Funktion soll mit dem gewünschten Algorithmus im Telefonbuch suchen und die Zeit für die Suche messen (`import time`, siehe auch Aufgabe A5). Am Ende soll die Funktion einen Text in folgender Form ausgeben: "Die Telefonnummer von ... lautet .... Die Suche dauerte ... Sekunden." 
-  - Rufe nun die Funktion vier mal auf: Für `Annina` und `Lyanna` – jeweils mit der linearen und mit der binären Suche. 
  
-<nodisp 1> +<bottom-exercise id="b5" timeout="120" zip="https://bottom.ch/ksr/1m/null79.py.zip" showsolution> 
-++++Lösung| +<div slot="prompt"> 
-<html><bottom-editor timeout="180" zip="https://sca.ksr.ch/lib/exe/fetch.php?media=gf_informatik:programmieren_i:null79.py.zip">+Vergleiche die lineare Suche mit der binären Suche. Hierzu kannst du von Aufgabe B4 ausgehen: 
 +<ul> 
 +  <li>Behalte nur die Listen und die Definition der Funktion <code>binary_search()</code>
 +  <li>Ergänze die Datei um die Funktion <code>linear_search(l, v)</code> (am besten, du schreibst du sie selbst hin, anstatt sie zu kopieren). 
 +  <li>Definiere eine neue Funktion <code>stopwatch(algo, name)</code>. Sie hat zwei Argumente: 
 +  <ul> 
 +    <li><code>algo</code> ist der Name der Suchfunktion (Suchalgorithmus), die verwendet werden soll (also <code>binary_search</code> oder <code>linear_search</code>, ohne die Klammern des Funktionsaufrufs). 
 +    <li><code>name</code> ist der Name, nach dem gesucht werden soll. 
 +    </ul> 
 +  <li>Die Funktion soll mit dem gewünschten Algorithmus im Telefonbuch suchen und die Zeit für die Suche messen (<code>import time</code>, siehe auch Aufgabe A5). Am Ende soll die Funktion einen Text in folgender Form ausgeben: "Die Telefonnummer von ... lautet .... Die Suche dauerte ... Sekunden." 
 +  <li>Rufe nun die Funktion vier mal auf: Für <code>Annina</code> und <code>Lyanna</code> – jeweils mit der linearen und mit der binären Suche. 
 +</ul> 
 +</div> 
 +<template data-type="starter"> 
 +from null79 import names, numbers 
 + 
 +def binary_search(l, v): 
 +    """Gibt den Index des gesuchten Elements in l zurück, None, 
 +       wenn das Element nicht existiert.""" 
 +    # TODO implementieren 
 + 
 +def linear_search(l, v): 
 +    """Gibt den Index des gesuchten Elements in l zurück, None, 
 +       wenn das Element nicht existiert.""" 
 +    # TODO implementieren 
 + 
 +def stopwatch(algo, name): 
 +    """Ruft die Funktion algo auf und misst die Zeit der Ausführung.""" 
 + 
 +stopwatch(binary_search, 'Annina'
 +</template> 
 +<template data-type="solution">
 from null79 import names, numbers from null79 import names, numbers
 import time import time
Zeile 220: Zeile 259:
 stopwatch(linear_search, 'Lyanna') stopwatch(linear_search, 'Lyanna')
 stopwatch(binary_search, 'Lyanna') stopwatch(binary_search, 'Lyanna')
-</bottom-editor></html+</template> 
-++++ +</bottom-exercise
-</nodisp>+
  
  
Zeile 276: Zeile 315:
 ++++ ++++
 </nodisp> </nodisp>
- 
  
 #### Aufgabe B8: Rekursion (optional) #### Aufgabe B8: Rekursion (optional)
 +
 +<bottom-exercise id="b8" timeout="5" zip="https://bottom.ch/ksr/1m/null79.py.zip" showsolution>
 +<div slot="prompt">
 Bei der binären Suche gehen wir ja wie folgt vor: Bei der binären Suche gehen wir ja wie folgt vor:
-  - Index in der Mitte des Suchintervalls wählen. +<ul> 
-  Element in der Mitte auslesen. +  <li>Index in der Mitte des Suchintervalls wählen. 
-  Ist `element == suchesind wir fertig. +  <li>Element in der Mitte auslesen. 
-  Andernfalls wiederholen wir die Suche mit einem kleineren Teilintervall (zurück zu Schritt 1): +  <li>Ist <code>element == suche</code> sind wir fertig. 
-    Ist `suche < element`, so ist das neue Suchintervall die linke Hälfte. +  <li>Andernfalls wiederholen wir die Suche mit einem kleineren Teilintervall (zurück zu Schritt 1): 
-    Andernfalls ist `element < suche`, das neue Suchintervall ist die rechte Hälfte.+    <ul> 
 +      <li>Ist <code>suche &lt; element</code>, so ist das neue Suchintervall die linke Hälfte. 
 +      <li>Andernfalls ist <code>element &lt; suche</code>, das neue Suchintervall ist die rechte Hälfte. 
 +    </ul> 
 +</ul>
  
-Schreibe eine neue Funktion, `binaere_suche_rekursiv(l, suche, links, rechts)`. Die Funktion codiert die obigen Schritte statt einer `while`-Schleife soll die Funktion sich im Schritt 4 selber wieder aufrufen. Dieses Verfahren heisst **Rekursion**. Was sind die Startparameter für `linksund `rechts`?+<p>Schreibe eine neue Funktion, <code>binaere_suche_rekursiv(l, suche, links, rechts)</code>. Die Funktion codiert die obigen Schritte &ndash; statt einer <code>while</code>-Schleife soll die Funktion sich im Schritt 4 selber wieder aufrufen. Dieses Verfahren heisst <strong>Rekursion</strong>. Was sind die Startparameter für <code>links</code> und <code>rechts</code>?
  
-Rekursion eignet sich für viele Probleme, die sich mit _Divide Conquer_ (_Teile Herrsche_) lösen lassen: Probleme, die wir für den trivialen Fall mit einem Element lösen können, und die wir effizient von einem grösseren in ein kleineres Problem überführen können.+<p>Rekursion eignet sich für viele Probleme, die sich mit <em>Divide &amp; Conquer</em> (<em>Teile &amp; Herrsche</em>) lösen lassen: Probleme, die wir für den trivialen Fall mit einem Element lösen können, und die wir effizient von einem grösseren in ein kleineres Problem überführen können. 
 +</div> 
 +<template data-type="starter"> 
 +from null79 import names, numbers 
 + 
 +def binaere_suche_rekursiv(l, suche, links=None, rechts=None): 
 +    """Gibt den Index des gesuchten Elements in l zurück, 
 +       None, wenn das Element nicht existiert.""" 
 +</template> 
 +<template data-type="test"> 
 +assert binaere_suche_rekursiv(names, 'Lyanna', links=0, rechts=len(names)) >= 0 
 +assert binaere_suche_rekursiv(names, 'Lyanna') >= 0, "Aufruf ohne links / rechts sollte auch funktionieren" 
 +</template> 
 +<template data-type="solution"> 
 +from null79 import names, numbers
  
-<nodisp 1> 
-++++Lösung| 
-<html><bottom-editor timeout="180" zip="https://sca.ksr.ch/lib/exe/fetch.php?media=gf_informatik:programmieren_i:null79.py.zip"> 
 def binaere_suche_rekursiv(l, suche, links=None, rechts=None): def binaere_suche_rekursiv(l, suche, links=None, rechts=None):
     """Gibt den Index des gesuchten Elements in l zurück,     """Gibt den Index des gesuchten Elements in l zurück,
Zeile 322: Zeile 378:
 from null79 import names, numbers from null79 import names, numbers
 print(f'Die Telefonummer von Lyanna ist {numbers[binaere_suche_rekursiv(names, "Lyanna")]}.') print(f'Die Telefonummer von Lyanna ist {numbers[binaere_suche_rekursiv(names, "Lyanna")]}.')
-</bottom-editor></html+</template> 
-++++ +</bottom-exercise
-</nodisp>+ 
  
  
  • gf_informatik/suchen_und_sortieren/binaersuche.1775333637.txt.gz
  • Zuletzt geändert: 2026-04-04 20:13
  • von hof