Zum Inhalt springen
L

Das Video kommt von YouTube: erst beim Abspielen verbindet sich die Seite mit YouTube (Google).

EIG: Abstrakter Datentyp Wörterbuch

Harald Selke30:20 40 Aufrufe veröffentlicht Auf YouTube

Das Wichtigste aus dem Video

Tipp auf eine Zeit – das Video springt genau dorthin.

Transkriptautomatisch erstellt · 252 Zeilen
Herunterladen
  1. willkommen zur Einführung in die Informatik für Geisteswissenschaftler dieses Video ist entstanden im Rahmen der gleichnahigen Veranstaltung an der
  2. Universität Paderborn in diesem Video wollen wir uns einen dritten abstrakten Datentyp angucken nämlich das sogenannte Wörterbuch ein Wörterbuch soll für uns
  3. etwas dynamisches sein anders also als ein klassisches Wörterbuch das wir aus dem Regal nehmen und in dass wir nichts schreiben können sollen unsere
  4. Wörterbücher so aufgebaut sein dass wir in sich jederzeit etwas einfügen können daraus ergibt sich dann auch schon die erste Operation die wir für unsere
  5. Wörterbücher haben wollen nämlich eine insert diese soll einen Schlüssel und einen Wert bekommen solche Paare aus Schlüsseln und Werten kennen wir schon
  6. sie sind uns schon mal im Zusammenhang mit Attributen begegnet und hier ist es ganz ähnlich nehmen wir an wir wollten ein deutsch-englisches Wörterbuch haben
  7. der Schlüssel oder key wäre dann das deutsche Wort und der englische Begriff dazu wäre entsprechend der Wert der Value wir könnten das natürlich auch
  8. genau umgekehrt machen für ein englischdeutsches Wörterbuch da wäre dann das englische Wort der Schlüssel nachdem wir suchen und der valje dazu
  9. wäre dann die deutsche Übersetzung solche Wörterbücher sind aber auch allgemeiner einsetzbar es könnte sich beispielsweise auch um ein Lexikon
  10. Handeln ein Lexikon wäre dann eben so aufgebaut dass der Schlüssel das Wort ist unter dem wir den Eintrag im Lexikon finden würden und der Wert dazu wäre
  11. dann eben der gesamte Text der zu diesem Stichwort im Lexikon steht oder vielleicht sogar ein noch komplexeres Objekt das nicht nur aus Text besteht
  12. sondern vielleicht sogar Bilder oder was auch sonst noch immer enthält das heißt also die Schlüssel müssen einfach sein in dem Sinn dass sie schnell
  13. durchsuchbar sind sie müssen vor allem vergleichbar sein dafür können wir beispielsweise Zeichenketten oder Zahlen nehmen unsere W Werte aber können
  14. beliebig komplex sein sie können beliebige Objekte sein wir könnten also z.B ein Wörterbuch von den Studierenden unserer Universität verwalten in diesem
  15. Fall würden wir dann eher von einer Liste als von einem Wörterbuch sprechen dann wären beispielsweise die Matrikelnummer die Schlüssel und alle
  16. Daten die wir zu einem Studenten oder einer Studentin gespeichert haben wären entsprechend der Wert zu diesem Schlüssel wir könnten beispielsweise
  17. auch ein Telefonbuch haben in einem Telefonbuch wäre der Name der Schlüssel und die Telefonnummer dazu wäre der Wert da merken wir jetzt allerdings dass wir
  18. ein kleines Problem haben der Schlüssel wäre nämlich nicht eindeutig es könnte ja mehrere Leute gleichen Namens geben und das kommt gar nicht me mal so selten
  19. vor das ist natürlich etwas was bei uns nicht zulässig ist der Schlüssel muss eindeutig sein so verlangen wir das in unseren Wörterbüchern jeder Schlüssel
  20. darf nur genau einmal im Wörterbuch vorkommen man kann modifizierte Wörterbücher schreiben wir es erlauben dass ein Schlüssel mehrfach vorkommen
  21. darf das machen wir hier aber nicht wir wollen uns das Leben ein bisschen einfacher machen s dass unser Schlüssel immer eindeutig sein muss eben wie
  22. beispielsweise die Matrikelnummern oder wenn wir beispielsweise einen onlineeshop hätten könnten wir Produktnummern verwenden diese
  23. Produktnummern wären dann der eindeutige Schlüssel der Wert dazu wäre die komplette Produktbeschreibung und vielleicht nicht nur die Beschreibung
  24. sondern auch noch ein Bild und Kundenbewertungen und was weiß ich noch alles unsere Werte können also beliebige Komplexität erlangen wenn wir etwas in
  25. unserer Wörterbuch einfügen wollen müssen wir natürlich festlegen unter welchem Schlüssel unser Objekt das wir da jetzt haben abgespeichert werden soll
  26. und was der Wert ist der dazu gehört was unsere Werte sind lassen wir wie gesagt offen das ist einer der Gründe warum es sich bei diesem worörterbuch einen
  27. abstrakten Datentyp handelt wir sagen also nicht was für Objekte wir hier speichern wollen beliebige Werte sollen das sein was wir auch im Moment nicht
  28. vorsehen wollen ist dass wir den Wert zu einem Schlüssel aktualisieren können zu dem Zweck könnte man noch eine zusätzliche Methode Update einführen die
  29. es dann beispielsweise erlauben würde dass wir einen Eintrag nachträglich modifizieren also beispielsweise den Preis eines Produkts ändern oder den
  30. Namen einer Person das wollen wir hier nicht machen wir machen es uns wie gesagt relativ einfach wir wollen nur neue Objekte unter einem gegebenen
  31. Schlüssel einfügen und wir wollen Sie nachschlagen können nehmen also einfach einmal den einfachen Fall eines wirklichen Wörterbuchs in dem wir
  32. deutsche Begriffe nachschlagen und die englischen Übersetzungen dazu herausfinden können die Methode insert die wir als erstes betrachten müssten
  33. wir dann dementsprechend so aufbauen dass wir ein Insert zwei Zeichenketten übergeben nämlich zuerst als Schlüssel das deutsche Wort und als Wert dann das
  34. entsprechende englische Wort jeweils als Zeichenkette so sollte dann mit insert unser Wort oder unser Eintrag sollte ich vielleicht allgemeiner sagen in unser
  35. worörterbuch eingefügt werden wir wollen natürlich auch in der Lage sein zu einem gegebenen üs den entsprechenden Wert wieder aus dem Wörterbuch auszulesen es
  36. wäre ja dumm wenn man nur Sachen in das Wörterbuch einfügen aber nie wieder nachschlagen könnte der Sinn alses Wörterbuchs ist ja vor allem dass wir
  37. etwas nachschlagen können wir wollen also bei unserem Beispiel eines richtigen deutsch-englischwörterbuchs eben den deutschen Wert eingeben sagen
  38. wir wir suchen jetzt zu dem Wort Hirsch beispielsweise die Übersetzung dann soll das Wörterbuch natürlich entsprechend die englische Übersetzung zurückliefern
  39. oder allgemeiner gesprochen zu einem gesuchten Schlüssel soll der entsprechende Eintrag geliefert werden zu einer Matrikelnummer das
  40. entsprechende studentenobjekt zu einer ISBN-Nummer das entsprechende buchobjekt zu einer Bestellnummer das entsprechende Produkt oder was auch immer wir in
  41. unserem Wörterbuch gespeichert haben der Wert sollte also zurückkommen unsere Methode lookup zum nachschlagen muss also einen Rückgabewert liefern und der
  42. Rückgabewert soll der Wert sein den wir zu diesem Schlüssel im Wörterbuch gespeichert haben auch die Methode insert wollen wir übrigens mit einem
  43. Rückgabewert versehen sie soll nämlich true zurückgeben wenn das Einfügen geklappt hat und fals wenn es nicht geklappt hat und klappen soll das immer
  44. genau dann wenn zu dem Schlüssel noch kein Eintrag vorhanden ist das bedeutet also dass wir mit dem insert auch feststellen können ob ein Wort schon
  45. enthalten war dann durften wir sie nicht erneut einfügen weil ein Schlüssel ja wie gesagt nur einmal vorkommen darf wenn wir diese Prüfung nicht machen
  46. würden wäre es an dieser Stelle ein bisschen einfacher dafür aber an anderer Stelle komplizierter wir wollen daher diese Prüfung machen das heißt wir
  47. überprüfen grundsätzlich erst einmal ob das Wort schon enthalten ist ob also ein entsprechender Schlüssel schon vorhanden ist wenn das der Fall ist erlauben wir
  48. das Einfügen nicht ansonsten erlauben wir es und geben das auch nach außen als Rückmeldung zurück indem wir den rückgabewer true bei Erfolg zurückgeben
  49. oder false wenn das Element nicht eingefügt werden konnte weil zu dem Schlüssel bereits ein Eintrag vorhanden ist lookup wie gesagt erhält einen
  50. Schlüssel als Parameter und gibt dann entsprechend den Wert dazu zurück dann haben wir noch eine dritte Methode die wir umsetzen wollen das ist die Methode
  51. remove mit der wir ein Wort aus dem Wörterbuch löschen können also einen Eintrag aus dem Wörterbuch entfernen nehmen wir wieder das Beispiel eines
  52. Produktkatalogs wenn das Produkt nicht mehr bei uns existiert weil wir es nicht nicht mehr anbieten dann wollen wir es aus unserem Katalog entfernen oder ein
  53. Student oder eine Studentin an unserer Universität wird exmatrikuliert weil er oder sie z.B den Abschluss geschafft hat und dann natürlich anschließend nicht
  54. mehr Mitglied der Universität ist dann muss er oder sie also aus den entsprechenden Listen gelöscht werden und das ist genau das was wir mit remove
  55. machen auch dieser Methode übergeben wir natürlich nur einen Schlüssel also beim Studenten bzw der Studentin die Matrikelnummer und dann wurde das
  56. entsprechende Objekt gelöscht werden das kann offenbar nur gelingen wenn der Eintrag auch tatsächlich vorhanden ist und dann gibt ihr mit Methode true
  57. zurück weil es in diesem Fall wirklich gelungen ist dieses Element zu entfernen wenn es dagegen nicht gelingt weil nämlich beispielsweise der Schlüssel gar
  58. nicht im Wörterbuch enthalten war also der Student bzw die Studentin schon gar nicht mehr in unserer Liste drin war oder wir eine zufällig geratene
  59. Matrikelnummer verwendet haben die es aber gar nicht gibt dann würde unsere Methode remove entsprechend false zurückgeben und auch hier feststellen ob
  60. unsere Aktion erfolgreich war wir werden später noch eine vierte Methode dazu haben wollen nämlich eine Methode to String die das komplette Wörterbuch
  61. ausgibt aber darum kümmern wir uns später auf diese Art und Weise können wir dann also diese ganzen Operationen durchführen und auch wenn das erst
  62. einmal sehr eingeschänkt klingt haben wir mit diesem wterbuch schon ein sehr umfangreiches Anwendungsspektrum man kann also schon eine ganze Menge mit
  63. einem solch doch recht einfachen Ding machen deshalb wollen wir uns dieses Ding jetzt genauer angucken wenn wir das nun praktisch umsetzen und ausprobieren
  64. wollen müssen wir uns einmal kurz Gedanken machen auch wenn uns das hier eigentlich noch am Rande interessiert was wir denn tatsächlich hier in unseren
  65. Wörterbüchern speichern wollen und das können wir gerade schon beschrieben verschiedenste Dinge sein wir machen es un hier ganz einfach unsere Wörter
  66. sollen tatsächlich Wörter sein also Übersetzungen von deutschen Wörtern in englische Wörter unsere Wörter sind daher einfach so aufgebaut dass sie zwei
  67. Komponenten haben nämlich ein Wort ein deutsches als Schlüssel und ein Wort ein englisches als Wert man kann sich das also im Grunde so vorstellen wie das
  68. hier rechts auf der Folie sehen zu sehen ist also wie ein doppelkästchen bei dem ich hier in fett gedruckt oben den Schlüssel stehen habe und als Wert
  69. darunter die entsprechende englische Übersetzung so zumindest kann man sich das vorstellen intern ist dann natürlich nicht als Kästchen gespeichert sondern
  70. wir haben ein wortobjekt mit zwei Eigenschaften und das sehen wir hier links in unserem Quelltext die Klasse Word hat einen Konstruktor dem wir einen
  71. Schlüssel und einen Wert übergeben können wir würden also dann beispielsweise Hirsch und dir übergeben diese beiden Werte werden dann in den
  72. Eigenschaften key und value gespeichert der erste Parameter als Key der zweite als value unsere Wörter verfügen außerdem über eine Methode to String mit
  73. der sie sich ausgeben können wir machen es uns hier wieder ganz einfach sie geben sich einfach als Absätze aus so können wir dann später einfach einzelne
  74. Wörter oder auch das ganze Wörterbuch ausgeben jedes Wort steht dann in einem eigenen Absatz in dem zunächst der Schlüssel steht also das deutsche Wort
  75. dann ein Doppelpunkt und dahinter dann der Wert also die englische Übersetzung zu diesem Wort bei diesem beispielwort würde also Hirsch Doppelpunkt dir als
  76. Absatz auf unserer Webseite ausgegeben werden wenn wir diese Methode aufrufen wir können dann wie wir das ganz unten auf der Folie im Beispiel sehen mit New
  77. World in Klammern dann Hirsch und der oder New World Feuerwehr 112 beispielsweise einen entsprechenden Wörterbucheintrag bzw Telefonbucheintrag
  78. vornehmen komplizierter sind unsere Objekte hier nicht wir könnten aber wie gesagt auch ganz andere Dinge haben viel komplexere Objekte und dann tatsächlich
  79. würde das alles was wir hier gleich machen werden sogar auch funktionieren wenn wir unsere Buchobjekte vom letzten Mal als Werte einsetzen würden das
  80. könnten wir hier deshalb machen weil auch diese Buchobjekte ja wissen wie sie sich als Zeichenkette ausgeben würden wir müssen das ein kleines bisschen
  81. modifizieren weil wir damit Tabellen gearbeitet haben aber das ist gar nicht so kompliziert wir werden relativ schnell dabei dass wir auch einen
  82. Buchkatalog beispielsweise haben könnten da müssten wir uns nur überlegen was wir als Schlüssel verwenden würden das könnten z.B isbnnummern sein die genau
  83. zu einem solchen Zweck erfunden worden sind so einfach sehen also unsere Wörter aus und jetzt können wir die Wörter in ein Wörterbuch schreiben Wörterbuch
  84. heißt auf Englisch dictionary und deshalb nennen wir unseren abstrakten Datentyp auch so auch für das Dictionary benötigen wir natürlich einen
  85. Konstruktor und wenn wir ein neues Wörterbuch erstellen wollen mit new dictionary und das dann in einer Variablen speichern leted d gleich new
  86. dictionary beispielsweise könnten wir zunächst ein leeres Wörterbuch erzeugen und bei diesem Wörterbuch machen wir das ähnlich wie wir das in den letzten
  87. beiden Videos gesehen haben wir haben eine interne Eigenschaft die wir wieder data nennen die soll wieder nur intern verwendet werden von außen wird man
  88. keinen Zugriff auf Sie verwenden wollen man bräuchte da ein spezielles Konstrukt mit dem wir uns hier nicht beschäftigen wollen um einen solchen Zugriff auch
  89. tatsächlich zu unterbinden hier ist es zwar theoretisch möglich auf die Eigenschaft data zuzugreifen aber wir wollen das auch hier wieder nicht tun
  90. wir wollen nur mit den Methoden die wir für das dictionary gleich noch definieren werden darauf zugreifen in der nächsten Woche werden wir uns diese
  91. interne Datenstruktur noch einmal genauer angucken da werden wir uns angucken was die hier von mir gewählte Variante nämlich ein Array zu verwenden
  92. für Nachteile hat und wir werden Sie dann durch eine komplett andere Datenstruktur ersetzen ohne dass sich aber an dem dictionary nach außen hin
  93. etwas ändert das heißt dass ich unsere Abstraktion die wir in dem Datentyp vornehmen dann noch einmal zeigen wird da wir nämlich die interne Struktur
  94. dieses Datentyps zunächst einmal eigentlich gar nicht festgelegt haben erst in dem Moment in den wir ihn implementieren wollen und das ist der
  95. Punkt an dem wir gerade stehen müssen wir uns überlegen wie wir das konkret machen möchten hier verwenden wir wie gesagt ein Array und dann können wir uns
  96. das so vorstellen wie ich das da rechts schon einmal angefangen habe hinzumalen das können wir jetzt zunächst einmal z.B für das erste Tier machen wenn wir jetzt
  97. ein weiteres Tier einfügen würde das entsprechend hinten dran geschrieben werden wir können dann ein drittes Tier einfügen und dann fügen wir noch ein
  98. viertes Wort hinten an hier sind das immer Tiere also immer deutsch-englische Wortpaare von Tieren aber das ist natürlich nur mehr oder weniger zufällig
  99. so wenn wir hier nur den Hasen einfügen sehen wir allerdings auch dass unser dictionary eine kleine Merkwürdigkeit aufweist es ist nämlich nicht sortiert
  100. wir fügen die Elemente einfach immer hinten an die Einträge sind also nicht alphabetisch sortiert wie wir das normalerweise von einem Wörterbuch
  101. erwarten würden warum nun das einfügen würde viel komplizierter werden wenn wir das machen würden zum Nachschlagen hätte das allerdings auch gewisse Vorteile das
  102. gucken wir uns aber später noch mal an für den Augenblick machen wir es einfach also einfach so dass wir immer wenn wir ein neues Wort haben dieses einfach
  103. hinten anfügen und jetzt müssen wir uns natürlich überlegen wie wir diese Methoden umsetzen können also die Methoden lookup insert remove und to
  104. String ich beginne mit der Methode insert wir wollen uns also überlegen wie wir zunächst einmal einen neues Wort in unser Wörterbuch einfügen nun das
  105. funktioniert so dass wir einen Key und einen value übergeben bekommen also Hirsch und dir beispielsweise als deutsches und als englisches Wort das
  106. sind unsere beiden Parameter was müssen wir jetzt machen wir müssen zunächst einmal über prüfen ob das Wort schon in unserem Wörterbuch vorhanden ist dafür
  107. können wir die Methode lookup verwenden die werden wir noch schreiben müssen zum Glück verfügt unser worörterbuch ja über eine solche Methode aber noch haben wir
  108. sie nicht trotzdem wir sind ja vorausschauend wir wissen dass wir diese Methode gleich noch schreiben werden werden wir die hier verwenden wir wissen
  109. auch schon das hatten wir schon festgelegt dass die Methode lookup den wird fals zurückliefern wird wenn der Schlüssel nicht im Wörterbuch enthalten
  110. ist das heißt also wenn this.lup für den Schlüssel den wir gerade übergeben bekommen haben gleich false ist dann wissen wir dass in unserem Wörterbuch
  111. bislang kein entsprechendes Wort unter diesem Schlüssel gespeichert ist und das bedeutet wir können dieses Wort nun selber bedenkenlos einfügen dafür bauen
  112. wir ein neues wortobjekt zusammen mit neww key value key und value haben wir hier als Parameter übergeben bekommen bauen wir jetzt ein wortobjekt zusammen
  113. und dieses wortobjekt fügen wir dann wo ein na ja in unsere interne Datenstruktur natürlich unsere interne Datenstruktur ist im Moment ein Array
  114. und an ein Array können wir einfach hinten etwas anfügen indem wir die Methode Push für dieses Array aufrufen dieses interne Array heißt dis. datata
  115. dann schreiben wir hinter dahinter pun Push und übergeben dem als Parameter unser Wort das wir gerade mit New World key value erzeugt haben wir hätten
  116. dieses Wort auch erst in einer lokalen Variablen in der Methode speichern können und dann diese Variable an dis.data.push übergeben aber so ist es
  117. kürzer und funktioniert mindestens genauso gut mit dieser einen Zeile sorgen wir also dafür dass ein neues wortobjekt erzeugt wird und dieses
  118. wortobjekt in das aray eingeführt wird und zwar an die hinterste Stelle anschließend wissen wir dass das funktioniert hat und deshalb können wir
  119. jetzt true zurückgeben und sind fertig wenn hingegen this. lookup von Key nicht false ist also true ist dann muss das Insert umgekehrt aber false zurückgeben
  120. denn wenn das Objekt schon im Wörterbuch gefunden wurde ein Eintrag mit dem entsprechenden Schlüssel also schon vorhanden ist dann bedeutet das dass wir
  121. auf keinen Fall den neuen Wert einfügen dürfen und wenn wir das übergebene Wort nicht einfügen so hatten wir gesagt dann soll insert den Wert false zurückliefern
  122. auf diese Art und Weise haben wir also jetzt sichergestellt dass ein neues Wort eingefügt wurde wenn es zu dem entsprechenden Schlüssel noch kein Wort
  123. gab wir geben mit dem Fall true zurück wenn das funktioniert hat und wir geben false zurück wenn das nicht funktioniert hat jetzt müssen wir natürlich dafür
  124. sorgen dass wir die Methode lookup implementieren wie gucken wir denn jetzt bitteschön nach ob ein Wort in diesem Wörterbuch schon enthalten ist gut da
  125. bleibt uns gar nichts anderes übrig als unsere interne Datenstruktur zu durchsuchen im Augenblick ist das ein Array und so müssen wir denn das interne
  126. Array von vor vorne bis hinten durchlaufen denn wir haben ja keine Ahnung wo in diesem aray der Hirsch vielleicht stehen könnte als ich eben
  127. den Hirsch eingefügt habe war das wörterbook ja noch sehr klein aber nehmen wir z.B den Hasen als der eingefügt wurde da wussten wir nicht wo
  128. wir suchen sollen wir können ja nicht sagen dass wir am Anfang gucken müssten oder in der Mitte oder am Ende wir haben ja keine Ahnung wie das Wörterbuch
  129. aufgebaut ist es ist ja unsortiert bzw die Wörter stehen in der Reihenfolge darin in der die Wörter eingefügt wurden wir haben also keine andere Wahl als das
  130. was wir bislang auch schon immer gemacht haben also wenn wir beispielsweise ein bestimmt des Elementen der Bücherliste gesucht haben die wir neulich umgesetzt
  131. haben auch da mussten wir immer das komplette Array von vorne bis hinten durchlaufen das hat gewisse Nachteile und ist oft nicht geschickt aber bislang
  132. hatten wir uns dann nie einen Kopf drum gemacht und so wie wir hier jetzt angefangen haben haben wir erst einmal gar nicht viele Möglichkeiten das anders
  133. zu machen aber das werden wir wie gesagt noch thematisieren wir machen es also wieder ähnlich wie wir das neulich bei den Bücherlisten gesehen haben genau wie
  134. dort nehmen wir uns eine Schleife her die wie wir das nun wahrlich schon oft gesehen haben von Null losläuft und dann durch das gesamte Array läuft wie lange
  135. ist das Array das interne Array heißt disp datata das hat length viele Elemente also läuft die Schleife solange unser Index i kleiner als disp data pun
  136. length ist und wir erhöhen i in jeder Runde um eins in der Schleife überprüfen wir in einer Abfrage if abfrage jeweils ob der Key den wir als Parameter über
  137. übergeben bekommen haben identisch ist mit dem Key des gerade betrachteten Elements im Array das heißt wenn wir beispielsweise den has und suchen gucken
  138. wir als erstes das nullte Element an das ist der Hirsch gewesen ist das deutsche Wort Hirsch zufälligerweise identisch zu H haben den gesuchten Schlüssel gefunden
  139. das ist natürlich nicht der Fall also gucken wir uns das nächste Wort an das ist das Schaf dann der Wahl und so weiter bis wir irgendwann beim Hasen
  140. angekommen sind und wenn die beiden Wörter übereinstimmen also der übergebene Schlüssel Hase mit dem Schlüssel unseres gerade betrachteten
  141. Wörterbuch eininttrags übereinstimmt Hase dann wissen wir in dem Moment dass wir jetzt den richtigen Schlüssel das richtige Wort gefunden haben und können
  142. den Wert das entsprechende englische Wort dazu das ja im value dieses Array Elements gespeichert ist zurückgeben unsere Methode liefert in diesem Fall
  143. also this. data an der Stelle i. value zurück wir erhalten also die englische Übersetzung zum Hasen wenn wir dagegen niemals eine Übereinstimmung finden dann
  144. läuft unsere Schleife bis zum Ende durch wir haben nie eine Übereinstimmung gefunden und wir wissen also dass der Gesuchte Schlüssel nicht im areay
  145. enthalten war und in diesem Fall geben wir forszeug weil wir ja nun sagen können tut mir leid zu dem Schlüssel haben wir keinen Eintrag gefunden und
  146. das ist genau das was luup machen sollte in diesem Fall soll die Methode false zurückgeben wenden wir uns jetzt im Löschen von Einträgen zu wie können wir
  147. das machen wie können wir einzelne Wörter aus dem Wörterbuch entfernen wir sehen schon dass der Code einigermaßen kompliziert ist woran liegt das nun wir
  148. hatten neulich ja schon bei einem Beispiel einmal diesen Effekt dass wenn wir aus einer Liste beispielsweise also also aus einem Array irgendwo mittendrin
  149. etwas herauslöschen Lücken in diesem Ding entstehen das möchte ich hier bei dem Wörterbuch vermeiden deshalb verwenden wir folgenden Trick den ich da
  150. oben mit diesem kleinen Diagramm das ich da aufgemalt habe illustrieren möchte nehmen wir an dass wir aus dem beispielwörterbuch von eben den Wahl
  151. löschen wollen unsere Methode kriegt also wieder einen Schlüssel übergeben z.B Wahl wir müssen jetzt wieder unser Array durchsuchen bis wir das
  152. entsprechende Element gefunden haben in unserem Beispiel befand sich dieser Eintrag an der dritten Stelle des Arrays es soll also das dritte Element gelöscht
  153. werden jetzt könnten wir es theoretisch einfach entfernen und dann nichts hineinschreiben dann haben wir aber hier ein undefiniertes Element mitten in
  154. unserem Wörterbuch hätten also sozusagen ein Loch darin wenn man so möchte das möchten wir vermeiden und deshalb gehen wir kurz so vor dass wir einfach das
  155. letzte Element nehmen und es an diese Stelle packen das letzte Element müssen wir dann natürlich löschen damit es nicht zweimal im Wörterbuch steht das
  156. darf nicht sein das letzte Element wird also in die gerade frei gewordene Stelle hineinverschoben und wenn wir das so machen vermeiden wir dass ein Loch in
  157. unserem Array entsteht jetzt kommt allerdings noch eine kleine zusätzliche Komplikation was machen wir denn wenn ausgerechnet das letzte Element gelöscht
  158. werden soll dann funktioniert der Mechanismus so nicht denn dann darf das letzte Element ja nicht woanders hinverschoben werden oder genauer gesagt
  159. auf sich selbst verschoben werden schaut euch den Code mal genau an und spielt das mal auf Papier durch in diesem Fall müssen wir direkt das letzte Element
  160. löschen und dann nichts weitermachen und das macht diese Methode remove jetzt ein kleines bisschen kompliziert das solltet ihr euch einmal ganz detailliert auf den
  161. Hirnwindungen zergehen lassen was machen wir also nun der Reihe nach wir bekommen einen Schlüssel übergeben Wahl beispielsweise jetzt laufen wir wieder
  162. durch unser Array genau wie wir das eben bei der Methode lookup gemacht haben wir machen fast genau das gleiche nur können wir die Methode lookup hier nicht
  163. verwenden weil die uns nicht sagt an welcher Stelle wir das Element gefunden haben wenn wir es denn finden sie sagt uns nur ich habe es gefunden und gibt
  164. dann den entsprechenden englischen Begriff zurück oder sie sagt einfach ich habe es nicht gefunden hier brauchen wir aber jetzt die Position an der wir das
  165. Element gefunden haben deshalb müssen wir hier im Grunde genommen dasselbe wie eben bei dem lookup noch einmal machen nur dass wir innerhalb der ifabfrage in
  166. dem Fall dass wir das Element gefunden haben nun etwas anderes tun wir laufen also wieder durch unser Array V let i = 0 i kleiner dis. datata.length i++ das
  167. komplette Array wird also von vorne bis hinten durchlaufen für überprüfen in jeder Runde ob der Schlüssel den wir übergeben bekommen haben übereinstimmt
  168. mit dem Schlüssel des gerade betrachteten Objekt soweit also alles wie eben wenn wir den gesuchten Schlüssel also das gesuchte Element
  169. gefunden haben müssen wir einmal überprüfen ob wir uns nicht an der letzten Stelle befinden wir prüfen also if I kleiner dis. dat L-1 wenn wir uns
  170. also nicht beim letzten Element befinden das ist die Situation wie sie in dem Bild oben dargestellt ist sondern irgendwo mittend drin nehmen wir das
  171. letzte Element in unserem Array wir wissen dass wir das kriegen mit this.data.pop die Methode Pop des Arrays liefert uns das letzte Element des
  172. Arrays und entfernt das aus ihm jetzt haben wir es quasi in der Hand und was machen wir mit dem Element das stecken wir jetzt genau an die aktuelle Position
  173. an der wir gerade stehen this. data an der Stelle i wird also dieses letzte Element zugewiesen wir brauchen keine neuen Wörter zu erzeugen sondern wir
  174. nehmen einfach das wortobjekt dass wir dort an der letzten Stelle des Ars gefunden haben und verschieben es an diese Position das haben wir mit dieser
  175. Anweisung erreicht jetzt müssen wir uns noch den elsfall angucken wenn also i== this. datap l -1 ist größer als dieser Wert kann i nie werden dafür sorgt
  176. unsere vorschleife ja i wird niemals größer als disp datap l -1 sein wenn i also gleich diesem Wert ist dann kommen wir in diesen zweiten Zweig hinein und
  177. dann machen wir einfach nur this.data.p das heißt wir entfernen einfach nur das letzte Element wir wollen das gar nicht zurückgeben und
  178. damit irgendetwas ma sondern lassen das Element dass die Methode Pop des Ars zurückgibt einfach verpuffen das Wort verschwindet es ist nicht mehr im
  179. worörterbuch enthalten in beiden Fällen folgt anschließend die Anweisung return true denn wir haben ja in beiden Fällen erfolgreich das gewünschte Element
  180. entfernt gucken uns das ganze jetzt noch einmal von innen nach außen an ganz innen haben wir also diese If Abfrage mit dem elszweig diese Abfrage überprüft
  181. nur ob es sich bei dem Gefundenen Element um das letzte Element des Arrays handelt oder nicht also ein inneres Element sozusagen in jedem beiden Fälle
  182. können wir das Element entfernen müssen dabei aber etwas unterschiedlich vorgehen wir wissen aber auf jeden Fall dass wir einen Schlüssel gefunden haben
  183. der mit dem Schlüssel des aktuell betrachteten Elements übereinstimmt das ist die äußere ifabfrage gewesen if key= this. data an der Stelle i. key wenn das
  184. also übereinstimmte können wir auf jeden Fall das Element entfernen und dazu gehört jetzt entsprechend diese Anweisung return true die wir hier sehen
  185. wir geben also genau in diesem Fall true zurück sagen also ja das Element konnte entfernt werden mit der Anweisung return true endet auch die Ausführung dieser
  186. Methode sobald wir ein Return erreicht haben wird die Abarbeitung einer Funktion oder Methode abgebrochen und wir gehen an die aufrufende Stelle
  187. zurück die Kontrolle ist also wieder an der aufrufenden Stelle beispielsweise im Hauptprogramm oder von wo auch immer wir aufgerufen worden sind zu der Anweisung
  188. return false die ganz unten als allerletztes noch außerhalb der vorschleife steht kommen wir immer nur dann wenn wir das komplette Array von
  189. vorne bis hinten durchlaufen haben und niemals eine Übereinstimmung des gesuchten Schlüssels mit im Schlüssel eines Eintrags gefunden haben wenn es
  190. irgendwann eine Übereinstimmung gegeben hätte wären wir irgendwann bei dem return true angekommen und hätten die Ausführung der Methode beendet nur wenn
  191. es sie nicht gibt kommen wir bei dem return false an und das heißt also dass in dem Fall unsere Methode remove entsprechend den Wert false
  192. zurückgliiefert also zurückmeldet dass das Element nicht entfernt werden konnte weil es kein Element mit dem entsprechenden Schlüssel dazu gab bleibt
  193. zu guter letzt noch die Methode to String die ich gerne umsetzen wollte die gehört wie gesagt streng genommen nicht zu dem Wörterbuch dazu aber auch die
  194. wollte ich hier gerne einmal zeigen wir wollen einmal das komplette Wörterbuch ausgeben können wie machen wir das nun ähnlich wie wir das schon mehrfach an
  195. anderer Stelle gesehen haben wir müssen im Prinzip nur unser komplettes aray von vorne bis hinten durchlaufen wir bauen uns in einer Ergebnis varariable die ich
  196. hier result genannt habe einfach eine Zeichenkette zusammen wir initialisieren die Variable result zunächst mit der leeren Zeichenkette wir durchlaufen das
  197. Array dann wie üblich von vorne bis hinten das ist unsere Schleife die wir das wie so oft haben und hängen jeweils das aktuelle Element an das aktuelle
  198. Element ist jeweils ein wortobjekt und wie sich ein wortobjekt ausgibt hatten wir vorhin schon gesehen nämlich als Absatz in der Form deutsches Wort
  199. Doppelpunkt englisches Wort so werden also alle Wörter nacheinander angefügt und das ganze als Zeichenkette zurückgegeben was wir an dieser Stelle
  200. allerdings auch schon sehen ist dass wir ein unsortiertes Wörterbuch zurückbekommen das ist für den Benutzer gar nicht schön wenn wir das anders
  201. haben wollten müssen wir uns jetzt erst noch irgendwie ein paar Gedanken dazu machen wie man ein solches Wörterbuch vielleicht auch sortieren könnte das
  202. machen wir aber nicht an dieser Stelle die Gedanken die ich mir an dieser Stelle gerne noch machen möchte betreffen die Frage wie denn eigentlich
  203. das Laufzeitverhalten dieses Wörterbuchs aussieht wie aufwendig ist denn das eigentlich was wir da machen überlegen wir dazu einmal was wir für die einzelne
  204. Operation machen müssen zunächst einmal für das Einfügen eines neuen Wortes was wir machen müssen ist dass wir und das klingt zunächst sehr einfach das neue
  205. Element nur hinten an das Array anhängen indem wir die Methode Push für das interne Array aufrufen aber tatsächlich ist es so einfach nicht wir müssen ja
  206. erst einmal nachgucken ob das Wort irgendwo in unserem Wörterbuch schon vorhanden ist das heißt wir müssen erst einmal das komplette Wörterbuch von
  207. vorne bis hinten durchlaufen im schlimmsten Fall im günstigsten Fall finden wir das Wort schon ganz vorne aber im schlimmsten Fall finden wir das
  208. Wort erst an der allerletzten Stelle und stellen fest ach das Wort ist ja schon im Wörterbuch der Schlüssel ist also schon vorhanden dann können wir es nicht
  209. einfügen das heißt wir durchlaufen im ungünstigsten Fall erst einmal das komplette areay und können dann erst sagen so jetzt können wir es einfügen
  210. dann hängen wir es hinten an das areay an und das eigentlich einfügen selber ist dann gar nicht mehr kompliziert und geht ganz schnell aber das nach schlagen
  211. am Anfang ob der Schlüssel schon im Wörterbuch vahen ist das ist genau das was es sehr aufwendig macht und wenn wir sehr große Wörterbücher haben stellen
  212. wir uns jetzt nicht irgendwie ein Wörterbuch mit zehn Einträgen vor sondern stellen wir uns vor unser Wörterbuch steht besteht aus einer
  213. Million Einträgen dann bedeutet das dass wir eine Million Schritte benötigen bis wir dann tatsächlich erstmal sagen können ja das Wort können wir einfügen
  214. es ist okay es gibt noch kein Wort mit diesem Schlüssel erst dann können wir mit dem einfügeprozess beginnen der ist dann in ull kom nichts erledigt da
  215. müssen wir nur einmal hinten an das er ein Element anfügen und das geht sehr schnell die Wortsuche das ist die zweite Methode
  216. die wir eben geschrieben haben die ist damit also das eigentliche Problem weil wir das ganze Ding das ganze are von vorne bis hinten durchlaufen müssen das
  217. hatten wir bei dem lookup auch gesehen auch da müssen wir alles von vorne nach hinten durchsuchen die Methode in der Methode insert sah man das nicht so
  218. direkt an weil dort gar keine Schleife vorkam aber wenn wir genauer hinsehen finden wir natürlich den Aufruf von lookup und wir wissen dann dass wir
  219. dessen Laufzeit mit berücksichtigen müssen wir könnten also jeweils dafür sorgen dass wir wenn wir ein neues Wort in unser Wörterbuch einfügen das
  220. komplette Wörterbuch immer sofort sortieren dann könnten wir uns ein clevereres Verfahren für das lookup ausdenken allerdings ist das Sortieren
  221. ebenfalls sehr aufwendig unter bestimmten Umständen kann sich das lohnen aber dafür müssten wir wissen wie das Wörterbuch verwendet wird werden z.B
  222. eher selten neue Einträge eingefügt aber häufig nachgeschlagen wäre die Sortierung vermutlich ein Gewinn denken wir noch einmal an eine Uni zurück die
  223. in einem solchen dictionary die Daten von Studierenden verwaltet da kämen vermutlich nur einmal pro Semester eine ganze Reihe neuer Einträge hinzu aber
  224. den Rest des Semesters wird man nur nachschlagoperationen haben da könnte es sich also lohnen über entsprechende Verbesserungen nachzudenken das
  225. Kernproblem dass wir hier bei allen drei Methoden insert lookup und remove haben ist dass wir erst einmal das richtige Wort suchen müssen also einen bestimmten
  226. Schlüssel in dem Array suchen müssen dafür müssen wir dieses Array von vorne bis hinten durchlaufen weil wir eben keine Sortierung haben deshalb müssen
  227. wir Element für Element für Element angucken diese Schleifen das hatten wir auch schon gesehen brechen zum Teil früher ab nämlich wenn der Schlüssel
  228. früh gefunden wird wir haben also keine feste Laufzeit die wir hier angeben können sondern die Laufzeit hängt gewissermaßen davon ab ob wir Glück
  229. haben oder Pech haben wenn wir Pech haben finden wir nämlich den richtigen Schlüssel erst im letzten oder vorletzten Element dann haben wir
  230. praktisch das gesamte Worterbuch durchlaufen und eine Million Einträge heißt eben eine Million vergleichsoperation die wir durchführen
  231. müssen wenn wir Glück haben haben wir immer nur den Hirschen gesucht wollten also immer ein Element das ganz weit vorne steht suchen finden oder entfernen
  232. das wäre schon ein riesiger Zufall jetzt kann man sich auch überlegen wie lange man denn so im Durchschnitt braucht dazu machen wir uns nächste Woche noch ein
  233. paar Gedanken das wollen wir in dieser Woche noch nicht angehen die Frage die man sich jetzt aber stellen kann und da kommen wir
  234. jetzt richtig in die Informatik hinein genau gesagt in das Themenfeld der Algorithmik ist ob es geeignete Algorithmen und Datenstrukturen gibt mit
  235. denen man so etwas geschickter hinbekommt als wir das jetzt gerade hier angestellt haben und da gibt es in diesem konkreten Fall zwei mögliche
  236. Strategien die eine besteht darin dass wir eben anders als wir es hier jetzt gerade gemacht haben eben doch eine solche sortierte Liste pflegen und dann
  237. in dieser Liste geschickt suchen das hat gewisse Vorteile es hat aber auch gewisse Nachteile und über die werden wir uns in der nächsten Woche Gedanken
  238. machen und das zweite was wir machen können ist dass wir eine ganz andere Datenstruktur verwenden die vielleicht in der Lage ist die Vorteile zu nutzen
  239. und die Nachteile dennoch zu vermeiden sie wird auch kleine Nachteile haben die nach aber die Nachteile sind vielleicht so geringfügig dass wir sie in Kauf
  240. nehmen einer der Nachteile wird insbesondere sein dass die Implementierung erheblich kompl erter wird und das ist etwas was wir uns in
  241. der nächsten Woche angucken wollen da wollen wir uns als krönenden Abschluss Gedanken dazu machen wie man zum einen eben über Effizienz nachdenken kann und
  242. wie man zum anderen verschiedene Strategien verfolgen kann um eine solche Datenstruktur effizienter hinzekommen damit sind wir mit dem abstrakten
  243. Datentyp Wörterbuch durch einer Datenstruktur die sehr flexibel einsetzbar ist die sehr umfangreiche Anwendungen hat und eben nicht nur für
  244. Wörterbücher sondern für alle möglichen Dinge wo man etwas nachschlagen möchte geeignet ist wir steigen in dieser Vorlesung noch nicht in das Thema der
  245. Datenbanken ein das kommt erst im übernächsten Semester aber eine Datenhaltung mit Hilfe von solchen schlüsselwertparen wo wir nach einem
  246. Schlüssel suchen wollen und ein Wert dazu zurückgeliefert bekommen wo wir einen Datenbestand dynamisch aufbauen können indem wir neue Elemente
  247. hinzufügen können wo wir Elemente entfernen können l sich hiermit sehr gut umsetzen dazu brauchen wir wie eben gesehen drei Operationen nämlich die
  248. drei Methoden die wir eben für das Wörterbuch vorgesehen haben insert lookup und remove man könnte sich noch eine Methode Update dazu vorstellen um
  249. Einträge aktualisieren zu können und weil wir neugierig sind sind haben wir auch noch eine zusätzliche Methode dur String implementiert um das Ganze
  250. Wörterbuch auszugeben die muss man nicht unbedingt haben wenn man das Wörterbuch vielleicht gar nicht als Ganzes ausgeben möchte aber wir haben das an dieser
  251. Stelle mal mit vorgesehen im beispielkode zu dieser Vorlesung könnt ihr euch auch anschauen wie das ganze denn funktioniert und dass man mit
  252. diesem Wörterbuch durchaus arbeiten kann tschüss bis zum nächsten Video

Zum Nachlesen