i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.1 Søgning
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.2 Søgeproblemer... Søgning efter fil(er) Søgning i databaser Søgning på Internettet Søgning efter en delstreng i en anden (søgning i to niveauer!) Afgør om et tal er et primtal Afgør om en sequence er sorteret...
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.3 Søgning (ineffektiv) public static boolean search(int e, Sequence s) { // post: returnerer om e findes i s boolean found; // resultat-variabel int i; // sweep-variabel i = 0; found = false; while ( i != s.size() ) { if ( s.elementAt(i) == e ) found = true; i++; } return found; }
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.4 Fornuftig søgning... ?
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.5 public static boolean search(int m, Sequence s) { // post: returnerer om m findes i s boolean found; // resultat-variabel int i; // sweep-variabel i = 0; found = false; while ( !found && i != s.size() ) { int e = s.elementAt(i); if ( e == m ) found = true; else i++; } return found; } Lineær søgning
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.6 Søgeskabelon Søgedomæne: S Kandidatmængde: K kandidatelement : e Målelement : m I et søgedomæne, S, søger vi efter et målelement, m. På et givet tidspunkt under søgningen har vi afsøgt en del af søgedomænet; den resterende del kalder vi kandidatmængden, K. Et skridt i søgningen består i at vælge et (tilfældigt) kandidatelement, e, fra kandidatmængden og sammenligne dette med målelementet m. Enten har vi fundet det vi søger, eller også afskærer vi en del af kandidatmængden. Søgningen slutter når vi har fundet det vi søger eller når kandidatmængden er tom.
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.7 Søgeskabelon, algoritmisk initialiser K ; found = false ; while ( !found && K Ø ) { udvælg e fra K ; if ( e == m ) found = true ; else split K ; }
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.8 Konkretisering af skabelonen S : initialiser K : K Ø : udvælg e fra K : split K : s[0..s.size()) i = 0; i != s.size e = s.elementAt(i); i++; s: i e
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.9 public static boolean search(int m, Sequence s) { // post: returnerer om m findes i s boolean found; // resultat-variabel i = 0; found = false; while ( !found && i != s.size() ) { int e = s.elementAt(i); if ( e == m ) found = true; else i++; } return found; } Lineær søgning
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.10 Søgning i sorteret sequence S : initialiser K : K Ø : udvælg e fra K : split K : s[0..s.size()) i = 0; i != s.size e = s.elementAt(i); if ( e < m ) i++; else // e > m i = s.size(); s: i e
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.11 public static boolean search(int m, Sequence s) { // pre: s er sorteret ( ) // post: returnerer om m findes i s boolean found; // resultat-variabel i = 0; found = false; while ( !found && i != s.size() ) { int e = s.elementAt(i); if ( e == m ) found = true; else if ( e < m ) i++; else // e > m i = s.size(); } return found; } Optimeret lineær søgning
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.12 Men vi kan gøre det bedre... Jeg tænker på et tilfældigt tal mellem 1 og 100; hvor hurtigt kan I gætte det? Hvert gæt koster 1 kr. Hvor mange kroner risikerer I at skulle betale?
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.13 Binær søgning i Java ?
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.14 Binær søgning s: l e h mi S : initialiser K : K Ø : udvælg e fra K : split K : s[0..s.size()) l = 0 ; h = s.size(); l < h mi = (l+h)/2; e = s.elementAt(mi) if ( e < m ) l = mi+1; else // e > m h = mi;
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.15 public static boolean search(int m, Sequence s) { // pre: s er sorteret ( ) // post: returnerer om m findes i s boolean found; // resultat-variabel l = 0; h = s.size(); found = false; while ( !found && l<h ) { int mi = (l+h)/2; int e = s.elementAt(mi); if ( e == m ) found = true; else if ( e < m ) l = mi+1; else // e > m h = mi; } return found; } Bineær søgning (Java)
i o p o DAIMI, AU, Oktober 1999Introducerende objektorienteret programmering7B.16 Binær søgning er effektiv! s.size() sammenligninger