Pimp A - info121A Programme Recherche Recherche linéaire
Transcription
Pimp A - info121A Programme Recherche Recherche linéaire
Programme Tri Pimp A - info121A Récursivité Programmation IMPérative Avancée Dichotomie Burkhart Wolff Frédéric Vernier Arbre Recherche linéaire Diviser pour mieux régner Graphe Examen blanc Recherche Rechercher un élément dans un ensemble Action fondamentale de l’informatique Base de donnée Savoir si un élément existe Récupérer d’autres infos associées etc. Recherche linéaire boucle 0-n boucle for si recherche exhaustive boucle while si on s'arrête au premier trouvé Adapté au(x) cache(s) O(n) Code C++ Recherche dichotomique SUR UNE LISTE TRIEE !!! #include <iostream> using namespace std ; string classLigue1_2010[20]={"Lille", "Sochaux", "Auxerre", "Nancy", "Nice", "Marseille", "Rennes", "St Etienne", "Montpellier", "Monaco", "Lyon", "Bordeaux", "Lorient", "Caen", "Lens", "Paris", "Toulouse", "Valenciennes", "Brest", "Arles-Avignon"}; Itération sur intervalle Coupe en deux Test de la valeur du milieu int main (int argc, char * const argv[]) { int i=0; while (i<20 && classLigue1_2010[i]!= "Caen") {i++;} if (classLigue1_2010[i]=="Caen") cout << "Oui Caen est bien en Ligue 1 " << endl; } Réajustement de l’intervalle par la droite si valeur trop “petite” par la gauche si valeur trop “grande” Code C++ #include <iostream> using namespace std ; Recherche 1/2 Chaine de caractère(string c++) int rechercheDichotomiqueINSEE (int insee) { inti; int g = 0; int d = liste.size()-1; do { i = (g + d) / 2; if(liste[i].Insee==insee) return i; else if (liste[i].Insee>insee) d = i - 1; else g = i + 1; } while (g <= d); return -1; } s1==s2 marche s1<s2 ne marche pas :-( s1.compare(s2) < 0 marche ! Bingo ! trop grand ! trop petit ! Résultats multiples élargissement des bornes Recherche du plus proche ... string Résultats multiples #include <iostream> using namespace std ; int rechercheDichotomiqueINSEE (string insee) { inti; int g = 0; int d = liste.size()-1; do { i = (g + d) / 2; if(liste[i].Insee==insee) return i; else if (liste[i].Insee.compare(insee)>0) d = i - 1; else g = i + 1; } while (g <= d); return -1; } A cause des corses ! int rechercheDichotomiquePop (int pop) { int i; int g = 0; int d = liste.size()-1; do { i = (g + d) / 2; if (liste[i].pop99==pop) { int ib = i; while (liste[ib-1].pop99==pop) ib--; int ia = i; while (liste[ia+1].pop99==pop) ia++; return ia-ib+1; } else if (liste[i].pop99>pop) d = i - 1; else g = i + 1; } while (g <= d); return -1; } Recherche 2/2 Recherche du plus proche Attention aux valeurs extrêmes Attention à la sortie de boucle Recherche binaire/dichotomique Bingo ! trop grand ! trop petit ! résultat le plus proche int rechercheDichotomiqueLat (float lat) { int i; int g = 0; int d = liste.size()-1; do { i = (g + d) / 2; if(liste[i].latitude_radian==lat || g==d) { return i; } else if (liste[i].latitude_radian>lat) d = i - 1; else g = i + 1; } while (g <= d); O(log(n)) Bingo double! if (abs(liste[g].latitude_radian-lat)>abs(liste[g+1].latitude_radian-lat)) return g+1; else return g; } quasi-Bingo ! Recherches multiples Recherche par interpolation (linéaire) 1 recherche = O(log(n)) n recherches = O(n.log(n)) i.e. recherche éléments de A qui sont aussi dans B Stratégie itération identique < O(log(n)) ~= O(log(log(n))) si répartition uniforme recherche linéaire sur la moins avancée des listes >O(log(n)) ~= O(n) si répartition non uniforme (rep. exp.) C’est pas toujours mieux ! Interpolation linéaire Exercices C’est la règle de 3 ! int rechercheInterpolationLineaireLat (float lat) { int i; int g = 0; int d = liste.size()-1; do { if (liste[d].surface==liste[g].surface) i = (g + d) / 2; else i = g+1+round((d-g-2)*(lat-liste[g].latitude_radian)/(liste[d].latitude_radian-liste[g].latitude_radian)); if(liste[i].latitude_radian==lat) { return i; } } prend un intermédiaire “proportionnel” Temps de calcul trier les 2 listes else if (liste[i].latitude_radian>lat) d = i - 1; else g = i + 1; } while (g <= d); return -1; Evalue la cible par rapport aux bornes index min valeur min Milieu ? Ici ? valeur recherchée Recherche par interpolation noms de communes latitudes de communes longitudes de communes index max valeur max surfaces de communes Quand est-ce mieux que dichotomique ?