Recherche dans une table



1. Algorithmes de recherche séquentielle dans une table
2. Algorithmes de recherche dichotomique dans une table
3. Algorithmes de recherche en hachage dans une table
4. L'exercice proposé

Cliquez ici pour retourner aux thèmes d'exercices : ....Hyperlien vers page de cours HTML


1. Algorithmes de recherche séquentielle dans une table
 

a première méthode pour rechercher un élément fixé dénomé clef dans une table consiste à faire une recherche séquentielle (ou linéaire). On examine successivement tous les éléments de la table et on regarde si l'on trouve un élément égal à l'élément fixé. Exemple de recherche d'un nom (string) fixé dans une table de 20 noms ( Array[1..20] of string ), la fonction renvoie le rang de la clef si elle a été trouvée sinon elle renvoie -1.

const N = 20 ;
type
 table = Array[1..N] of string ;

function Recherche (x: string ; nom : table): integer;
    var i: integer;
    begin
     Recherche := -1;
     for i := 1 to N do
        if x = nom[i] then begin
              Recherche := i ;
             Break ;
        end;
 end;



2. Algorithmes de recherche dichotomique dans une table

ne autre méthode de recherche en table est la recherche dichotomique. Supposons que notre table contienne des noms d'étudiants avec une note et qu'elle soit triée en ordre alphabétique. Au lieu de rechercher séquentiellement du premier jusqu'au dernier, on compare la clef à chercher au nom qui se trouve au milieu de la table des noms. Si c'est le même, on retourne la note de l'étudiant du milieu, sinon l'on recommence sur la première moitié (ou la deuxième) si le nom recherché est plus petit (ou plus grand) que le nom rangé au milieu de la table. Exemple de recherche d'un nom (string) fixé dans une table de 20 noms ( Array[1..20] of string ), la fonction renvoie le rang de la clef si elle a été trouvée sinon elle renvoie -1.

const N = 20 ;
type
 table = Array[1..N] of string ;

function Recherche (x: string ; nom : table): integer;
    var bas, milieu, haut: integer;
    begin
     bas := 1; haut := N;
     Recherche := -1;
     repeat
        milieu := (bas + haut) div 2;
        if x = nom[milieu] then
            Recherche := milieu
        else  if nom[milieu] < x then
                 bas := milieu + 1
               else
                  haut := milieu-1
    until (x = nom[milieu]) or (bas > haut);
 end;
 
 



3. Algorithmes de recherche en hachage dans une table

n utilise aussi une autre méthode de recherche en table est le hachage. On utilise une fonction de hachage f(x) sur l'ensemble de toutes les clés possibles (les clefs sont souvent des chaînes de caractères comme dans le cas de la liste d'étudiants) dans un intervalle d'entiers. Pour une clef x la valeur f(x) est l'endroit où l'on trouve la clef x dans la table. Tout se passe parfaitement bien si f(x) est une application bijective. Pratiquement, on ne peut arriver à atteindre ce résultat et donc f(x) est rarement injective ce qui veut dire que nous choisirons des fonctions de hachage f(x) dans lesquelles des clefs différentes auront la même valeur (on appelle cela des collisions). On tente alors de minimiser le temps de calcul de f(x) ainsi que le nombre de collisions par le choix au coup par coup d'une fonction de hachage judicieuse.
 



4. L'exercice proposé

'assistant vous propose d'exécuter à la main, pas à pas, le coeur principal de la boucle de recherche dichotomique dans un tableau de 20 entiers et dobserver le fonctionnement de l'algorithme. Vous devez rentrer une clef à chercher (dans la case Elt), puis ensuite cliquer sur le bouton [ Lancer la recherche dicho ], dans la fenêtre bleu de gauche l'assistant surligne la prochaine instruction du programme qu'il est prêt à exécuter. Un click sur le bouton [ pas suivant ] fait exécuter séquentiellement une instruction.

Dans l'exemple ci-dessus nous avons demandé la recherche de la clef 72 (du nombre 72) dans le tableau du bas. Les cases surlignées en bleu fonçé sont celles qui représentent l'intervalle de recherche actuel du programme [1,20]. Le principe dichotomique est de diviser cet intervalle en deux à chaque tours de boucle.

remier tours de boucle :


l'intervalle de recherche retenu est maintenant [11,20]
 

econd tours de boucle :


l'intervalle de recherche retenu est maintenant [11,14] etc...

inalement après la fin du dernier tours de boucle :


 

Ouf !