SOTE1­2016­10­17.notebook October 17, 2016 Hash­Code Anwendungsfälle • Speichern von Passwörtern • Integrität von Dateien (z.B. bei Downloads) prüfen • Prüfziffer Datei public int hashCode(Object o) { ... HashCode ("Prüfziffer") der Datei } 1 SOTE1­2016­10­17.notebook October 17, 2016 Eigenschaften von Hash­Funktionen • Bildet ein Objekt auf eine Zahl ab • Objekte haben eindeutige Hash­Codes • Es kann mehrere Objekte mit gleichem Hash­Code geben • Vom Hash­Code sollte man nicht auf das Objekt zurückschließen können • Hash­Funktionen bilden unendlich viel Objekte auf endlich viele Zahlen ab • Unterschiedliche oder geänderte Objekte (z.B. Dateien) sollen zu unterschiedlichen Hash­Codes führen • Verteilt die Rückgabewerte möglichst gleichmäßig auf den zur Verfügung stehenden Wertebereich Das wäre keine gleichmäßige Verteilung der Werte auf den Wertebereich 2 SOTE1­2016­10­17.notebook October 17, 2016 Einfaches für Objekt, bei denen nur aus einer Zahl Einfaches für Objekt, bei denen nur aus einem der HashCode berechnet wird String der HashCode berechnet wird Modulo beschränkt den künftig verwenden Wertebereich auf 0...9 Berücksichtigt die Position im String, um z.B. "otto" von "toto" zu unterscheiden 3 SOTE1­2016­10­17.notebook October 17, 2016 charAt liefert die entsprechenden Zahlen zurück z.B. 65 für "A" 4 SOTE1­2016­10­17.notebook October 17, 2016 Ob beide Attribute für die Hash-Code-Berechnung notwendig sind, ist eine Geschäftsentscheidung. Es müssen nur die Primärschlüssel verwendet werden. Niemals hashCode ohne equals (und umgekehrt) implementieren 5 SOTE1­2016­10­17.notebook Bäume October 17, 2016 Niveau 0 Niveau 2 Definitionen • Elternelement: direkter Vorgänger (Richtung Wurzel) • Kindelement: Direkte Nachfolger • Blatt: Elemente/Knoten ohne Kindelemente • Teilbaum: Knoten und alle seine direkten und indirekten Nachfolger • Grad > eines Knotens: Anzahl der direkten Nachfoger > eines Baums: Maximaler Knotengrad (hier: 3) • Binärbaum: Baum des Grad 2 • Vielwegbaum: Baum eines Grads > 2 • Tiefe (eines Knotens): Länge des Pfads bis zur Wurzel (z.B. hat 6 die Tiefe 2) • Niveau: Alle Knoten gleicher Tiefe • Höhe: Größte Tiefe +1 (hier 3) 6 SOTE1­2016­10­17.notebook October 17, 2016 Binäre Suchbäume In binären Suchbäumen finden sich im linken/rechten Teilbaum eines jeden Knotens nur Elemente, die kleiner/größer sind 7 SOTE1­2016­10­17.notebook October 17, 2016 a) 10, 5, 14, 7, 18, 12, 6 5 10 5 6 14 7 6 b) 5, 6, 7, 10, 12, 14, 18 7 12 18 12 14 18 Ein zu einer linearen Liste "entarteter" binärer Suchbaum Reihenfolge des Einfügens ist entscheidend! 8 SOTE1­2016­10­17.notebook October 17, 2016 Neue Begriffe • Bilanz (eines Knotens): Differenz der Höhen des rechten und linken Teilbaums • Höhenbilanzierter Baum: Baum, der nur Knoten mit Bilanzen ­1, 0 und 1 hat • Vollständiger Baum: Baum, der auf jedem Niveau n < Höhe die maximale Knotenanzahl hat (voll außer unterstes Niveau) • Vollen Baum: Baum, der auf jedem Niveau die maximale Knotenanzahl hat. • 1, 2, 3 1, 2 1, 2 2 1 -1 10 5 14 7-1 6 12 0 0 0 18 0 1. Höhenbilanziert 2. Vollständig 3. Voll nix Bilanz: -2 nix nix -2 voll => vollständig => höhenbilanziert 9 SOTE1­2016­10­17.notebook October 17, 2016 AVL Bäume ­ Adelson, Veliskii, Landis ­ := höhenbilanzierter binärer Suchbaum Rezept (Algorithmus) zum Einfügen von Elementen in binäre Suchbäume 1) Einfügen wie bisher 2) Sofort auf Höhenbilanziertheit prüfen 3) Falls die Balance B < ­1 oder > 1, dann sofort umstrukturieren > Linksrotation, falls B > 1 > Rechtsrotation, falls B < ­1 > Rechtslinksrotation, falls B > 1 und B(Nachfolgeknoten) ­1 > Linksrechtsrotation, falls B < ­1 und B(Nachfolgeknoten) +1 10 SOTE1­2016­10­17.notebook October 17, 2016 Regel für Rechts­/Linksrotation: Falls ein Knoten nicht höhenbilanziert ist (hier M), wird er nach rechts/links geschoben. Ein möglicher rechter/linker Nachfolger (H) wird linker/rechter Nachfolger des rotierten Knotens F M A F A O C F H M M A O H C O H C 11 SOTE1­2016­10­17.notebook October 17, 2016 5, 8, 2, 6, 10, 9 Rezept (Algorithmus) zum Einfügen von Elementen in binäre Suchbäume 1) Einfügen wie bisher 2) Sofort auf Höhenbilanziertheit prüfen 3) Falls die Balance B < ­1 oder > 1, dann sofort umstrukturieren > Linksrotation, falls B > 1 > Rechtsrotation, falls B < ­1 > Rechtslinksrotation, falls B > 1 und B(Nachfolgeknoten) ­1 > Linksrechtsrotation, falls B < ­1 und B(Nachfolgeknoten) +1 Regel für Rechts­/Linksrotation: Falls ein Knoten nicht höhenbilanziert ist (hier M), wird er nach rechts/links geschoben. Ein möglicher rechter/linker Nachfolger (H) wird linker/rechter Nachfolger des rotierten Knotens 5 0 2 5 81 2 6 8 8 10 -1 9 2 6 10 9 5 2 6 10 9 -1 12 SOTE1­2016­10­17.notebook October 17, 2016 13