1 2 Enführung n de Programmerung Bertrand Meyer Vorlesung 13: Contaner-Datenstrukturen Letzte Bearbetung 1. Dezember 2003 Themen für dese Vorlesung 3 Contaner-Datenstrukturen 4 Contaner und Genercty Enthalten andere Objekte ( s ) Statsche Typserung Bespel: Ene Metrolne st unter anderem en Contaner von Haltestellen Lestung von Algorthmen beurtelen: Bg-Oh- Notaton Verkettete Lsten Möglche Operatonen auf enem Contaner: En Item enfügen Herausfnden, ob en Element enthalten st En Element entfernen De Struktur traverseren um ene Operaton auf jedes Item anzuwen Arrays Vele Arten: Lsten (nkl. lnked lst, ublylnked lsts ), zrkuläre Lsten, Arrays, Stacks, Queues, Prorty-Queues, Hashtabellen En Grundproblem von Contanern 5 Ernnerung: Lsten-Konventonen 6 We behandeln wr Varanten ener Contaner- Klasse, de sch nur durch den Typ hrer Items unterscheden? before after Metrolne: Lste von Haltestellen Route: Lste von Segmenten Telefonlste: Lste von Verzechnsenträgen Aga: Lste von Verabredungen 1 start ndex back forth (Der Cursor) 1
Ohne Genercty 7 Ohne Genercty 8 class METRO_LINE feature start s forth s : METRO_STOP s put_rght (x: METRO_STOP) s Somethng nvolvng x ext (x: METRO_STOP) s class ROUTE feature start s forth s : SEGMENT s put_rght (x: SEGMENT) s Somethng nvolvng x ext (x: SEGMENT) s Ohne Genercty 9 Ene ncht-genersche Lst-Klasse 10 class AGENDA feature start s forth s : APPOINTMENT s put_rght (x: APPOINTMENT) s Somethng nvolvng x ext (x: APPOINTMENT) s class LIST1 feature start s forth s : ANY s put_rght (x: ANY) s Somethng nvolvng x ext (x: ANY) s Generalserte Lste benutzen 11 Lösungen 12 my_route: LIST1 my_aga: LIST1 my_route.ext (seg) my_aga.ext (app) seg := my_route. app := my_aga. seg: SEGMENT app: APPOINTMENT Code wederholen (ncht wrklch akzeptabel) Konversonen, oder casts, erlauben Ungeprüft: C, C++ Geprüft: Java, C# app?= my_aga. f app /= Vod then app := my_route. --????????? Typen-Parametrserung explzt machen (Effel): Genercty 2
Lösung: Genercty 13 Generalserte Lste benutzen 14 class LINKED_LIST [G] feature start s Formaler generscher forth s Parameter : G s put_rght (x: G) s Somethng nvolvng x ext (x: G) s my_route: LIST1 my_aga: LIST1 my_route.ext (seg) my_aga.ext (app) seg := my_route. app := my_aga. app := my_route. --????????? seg: SEGMENT app: APPOINTMENT Genersche Lst-Klasse benutzen 15 Statsche Typserung 16 my_route: LIST [SEGMENT] my_aga: LIST [APPOINTMENT] my_route.ext (seg) my_aga.ext (app) seg := my_route. app := my_aga. seg: SEGMENT app: APPOINTMENT tatsächlcher generscher Parameter Jede Enttät des Programms st mt enem Typen deklarert Jede Zuwesung und jeder Feature-Aufruf muss de Typkompatbltäts-Regeln befolgen Zel: Ne en Feature auf en Objekt anwen, für das deses Feature ncht defnert st app := my_route. -- Type-wrong, rejected Wchtgste Plattüde n der Software-Entwcklung! 17 Ene genersche Klasse: LINKED_LIST 18 Besser enen Fehler früh als spät abfangen Demo (sehe EffelStudo) Besser n der Analyse als m Desgn Besser m Desgn als n der Implementaton Besser n der Komplaton als bem Testen Besser bem Testen als m Ensatz 3
Maxmum berechnen, Verson 1 19 Der Routne-Body, Verson 1 20 hghest_name (lne: METRO_LINE): STRING s -- Alphabetsch grösster Statonsname der Lne lne_exsts: lne /= Vod fancy_lne.start ; Result := " nvarant varant fancy_lne.after Result := greater (Result, lne..name) fancy_lne.forth ensure Result /= Vod and then not Result.empty forth fancy_lne.start ; Result := "" fancy_lne.after Result := greater (Result, lne..name) fancy_lne.forth Der Routne-Body, Verson 2 21 Der Routne-Body, Verson 3 22 : INTEGER _th () : INTEGER _th () := 0 ; Result := "" > n := + 1 Result := greater (Result, lne._th ().name) := + 1 ; Result := "" = 0 := 1 Result := greater (Result, lne._th ().name) We schnell st der Algorthmus? 23 Wesentlche Effzenz abschätzen 24 Abhängg von der Hardware, Betrebssystem, Belastung der Maschne Aber am fundamentalsten abhängg vom Algorthmus! We verhält sch de Laufzet (und der Specherverbrauch) des Algorthmus als Funkton der Grösse der Daten, wenn dese Grösse resg wrd? Verson 1: Zet etwa proportonal zu. Versonen 2 und 3: könnte proportonal zu oder zu 2 sen! 1 + 2 + + = * ( + 1) / 2 4
Bg Oh Notaton 25 Formell 26 O (f (n)), wobe n de Grösse der Engabe repräsentert, bedeutet n der Grössenordnung von f (n). f st n O (g (n)) bedeutet, es gbt ene Konstante K, so dass für alle n glt: Zet für Verson 1 st O () f (n) / g (n) <= K Zet für Versonen 2 und 3 kann O () oder O ( 2 ) sen. O (1) bedeutet also n konstanter Zet, oder durch ene Konstante beschränkte Zet. Auch verwet: f (n) = 3 n 2 + O (g (n)) Bespele 27 Mt ener 1000mal schnelleren Maschne 28 n 2 = 3 n 2 = 3 n 2 + 2 n + 1 = O (n 2 ) O (n 2 ) O (n 2 ) Ver Algorthmen: O (log (n)) Vorherge Maxalgrösse: N Neues Maxmum: N 1000 3 n 2 + 2 n + 1 = O (2 n 2 ) O (n) 1000 N O (n 2 ) 32 N 3 n 2 + 2 n + 1 = 3 n 2 + O (n) O (2 n ) N + 10 Verkettete Lsten 29 hghest_name, Verson 2 30 Haldenegg rght 3 actve Central (Der Cursor) frst_element rght Hauptbahnhof rght : INTEGER _th () := 0 ; Result := "" > n := + 1 Result := greater (Result, lne._th ().name) 5
hghest_name, Verson 3 31 Performance 32 : INTEGER _th () := + 1 ; Result := "" = 0 := 1 Result := greater (Result, lne._th ().name) _th st n O () (n Verson 3) Folglch st hghest_name, und jede andere solche Traverserung, n O ( 2 )! 1 + 2 + + = * ( + 1) / 2 = O ( 2 ) Arrays 33 Array Klassen-Interface 34 class ARRAY [G] feature Indexert von ener unteren bs zu ener oberen Schranke Zugrff auf oder Modfkaton enes Elements st n O (1) (konstante Zet) () lower, upper: INTEGER make (l, h: INTEGER) s -- Allocate wth bound l and h. hgh >= low hgher >= low lower upper Im Memory: n aufenander folgen Stellen gespechert (: INTEGER): G s -- Entry of ndex >= lower <= upper put (x: G; : INTEGER) s -- Replace by x the value of the entry of ndex >= lower <= upper Arrays benutzen 35 Varante: Hashtabellen 36 your_array: ARRAY [REAL] drectory: HASH_TABLE [METRO_STATION, STRING] create your_array.make (1, 100) your_array.put (35.6, 7) your_array.put ( 45.0, 8) create drectory.make (100) drectory.put (Staton_balard, "BALARD") drectory.put (Staton_montrouge, "MONTROUGE") prnt (your_array. (8)) prnt (drectory. ("MONTROUGE")) 6
37 Ende der Vorlesung 13 7