DAIMIIntroducerende objektorienteret programmeringfletning.1 Fletning
DAIMIIntroducerende objektorienteret programmeringfletning.2 Fællesmængde... Man kan studere IT to steder på Aarhus Universitet, på Informations- og medievidenskab samt på Datalogisk Institut. Vi har to sekvenser; en med numre på studerende på Datalogisk Institut og en med numre på studerende på Informations- og medie- videnskab. Vi vil gerne frembringe en tredie som skal indeholder numrene på de studerende der læser begge steder.
DAIMIIntroducerende objektorienteret programmeringfletning.3... af to sekvenser... Hvordan gør vi det?... imv: dat: alle:
DAIMIIntroducerende objektorienteret programmeringfletning.4 Nestede løkker for ( int i = 0; i < imv.size(); i++ ) { for ( int j = 0; j < dat.size(), j++ ) { if ( imv.elementAt(i) == dat.elementAt(j) ) {... } size() size() i j
DAIMIIntroducerende objektorienteret programmeringfletning.5 Fletteproblemer Samkøring af tabeller (registre) i databaser og beregning af mængde- operationer som forenings- og fællesmængde er eksempler på problemstillinger der kan opfattes som fletteproblemer forudsat at datamængderne er sorteret. Fordelen ved at have datamaterialet sorteret er at man langt mere effektivt kan udføre den ønskede beregning, og specielt ved store datamængder er det virkelig noget der har betydning.
DAIMIIntroducerende objektorienteret programmeringfletning.6 Lidt effektivitetsovervejelser Lad os antage at en computer kan udføre operationer pr. sekund. Hvis vi samkører to registre med elementer med hovedet under armen, kræver det operationer svarende til sekunder hvilket er 11,6 dag! Hvis vi benytter fletteteknikken, kan vi med samme datamateriale klare os med operationer svarende til 2 sekunder! Med andre ord: det er ikke ligegyldigt hvordan man organiserer data og hvilke algoritmer man benytter til at operere på disse data.
DAIMIIntroducerende objektorienteret programmeringfletning.7 Fællesmængde, fletning s:s: t:t: res : i j k invariant: s[0..i) og t[0..j) er flettet sammen i res[0..k)
DAIMIIntroducerende objektorienteret programmeringfletning.8 Fællesmængde, algoritmisk public static Sequence intersection(Sequence s, Sequence t) { int i, j; Sequence res = new Sequence(); i = 0; j = 0; while ( i<s.size() && j<t.size() ) { if ( s.elementAt(i) < t.elementAt(j) ) { i++; } else if ( s.elementAt(i) > t.elementAt(j) ) { j++; } else { // s.elementAt(i) = t.elementAt(j) res.append(s.elementAt(i)); i++; j++; } } return res; }
DAIMIIntroducerende objektorienteret programmeringfletning.9 Foreningsmængde, fletning s:s: t:t: res : i j k invariant: s[0..i) og t[0..j) er flettet sammen i res[0..k)
DAIMIIntroducerende objektorienteret programmeringfletning.10 Foreningsmængde, algoritmisk public static Sequence union(Sequence s, Sequence t) { int i, j; Sequence res = new Sequence(); i = 0; j = 0; while ( i<s.size() && j<t.size() ) { if ( s.elementAt(i) < t.elementAt(j) ) { res.append(s.elementAt(i)); i++; } else if ( s.elementAt(i) > t.elementAt(j) ) { res.append(t.elementAt(j)); j++; } else { // s.elementAt(i) = t.elementAt(j) res.append(s.elementAt(i)); i++; j++; } } if ( j = t.size() ) // kopier resten af s over i res else // kopier resten af t over i res return res; }
DAIMIIntroducerende objektorienteret programmeringfletning.11 Fletteskabelonen g = [] ; while ( f 1 [] && f 2 [] ) { if ( head(f 1 ) < head(f 2 ) ) flyt 1 ; else if ( head(f 1 ) > head(f 2 ) ) flyt 2 ; else flyt 12 ; } if ( f 1 [] ) flythale 1 ; else if ( f 2 [] ) flythale 2 ; Abstrakt algoritme - uafhængig af kon- kret datastruktur (Sequence, Vector, String, File,...) - uafhængig af konkret beregning (union, intersection, sekven- tiel ajourføring,...)