Activités préparatoires#
Recherche textuelle
Activité 1 Chercher un mot, à la main#
Durée : 15 à 20 min · Par deux
Consignes
-
L’un déplace la bande, l’autre compte. Sans ordinateur.
-
Découper la bande
SOLEILplacée sous le texte (ou la recopier sur une bande de papier, avec des cases de même taille) : c’est la fenêtre que l’on fait glisser sur le texte, case par case. -
Les réponses s’écrivent sur le cahier. Une comparaison, c’est regarder une case de la bande et la case du texte juste en dessous (pareil ou pas ?). Les espaces (␣) sont des caractères comme les autres. Travail sans IA : ni assistant, ni complétion de code ; vous devez pouvoir expliquer chaque réponse.
Le texte et le motif#
On cherche le motif SOLEIL (\(6\) lettres) dans le texte ci-dessous (\(43\) caractères, positions numérotées à partir de \(0\)).
Bande à découper :
Première méthode : glisser d’une case à la fois#
Poser la bande sous le texte, à la position \(0\). Comparer les cases de gauche à droite ; dès qu’une case diffère, arrêter et faire glisser la bande d’une seule case vers la droite. Recommencer jusqu’à trouver SOLEIL.
-
Faire la recherche en comptant les comparaisons (un bâton par comparaison, sur le cahier). Combien de positions a-t-on essayées ? Combien de comparaisons en tout ?
-
À quelle position trouve-t-on
SOLEIL? Pour la plupart des positions, combien de comparaisons a-t-il fallu ? -
Si le texte était un livre d’un million de caractères, combien de positions faudrait-il essayer, à peu près ?
Deuxième méthode : regarder d’abord la fin#
On recommence à la position \(0\), mais on compare maintenant en commençant par la dernière case de la bande.
-
À la position \(0\), quelle lettre du texte se trouve sous la dernière case de la bande ? Apparaît-elle quelque part dans
SOLEIL? -
Si l’on décale la bande de \(1\), \(2\), … ou \(5\) cases, cette lettre sera encore sous la bande. Une de ces positions peut-elle donner
SOLEIL? De combien de cases peut-on donc faire sauter la bande d’un coup ? -
Plus loin, la lettre sous la dernière case est un
I, qui existe dansSOLEIL. De combien faut-il avancer la bande pour que ceIse retrouve sous leIde la bande ? -
Refaire toute la recherche avec cette règle : on regarde la lettre sous la dernière case ; si elle n’est pas dans le motif, on saute toute la bande ; sinon, on avance pour l’aligner avec la même lettre de la bande (la plus à droite, sans compter la dernière case). Recopier sur le cahier le tableau ci-dessous et le compléter, une ligne par position essayée.
Position Lettre sous la dernière case Comparaisons Saut \(0\) … … … … … … … Combien de positions a-t-on essayées ? Combien de comparaisons en tout ?
Ce qu’on a découvert#
-
Comparer le nombre de comparaisons des deux méthodes. Pourquoi la deuxième a-t-elle pu ne jamais lire certaines lettres du texte ?
-
Pour aller vite, il est utile de préparer avant la recherche, pour chaque lettre, le saut à faire. Recopier et compléter sur le cahier ce « pense-bête » pour
SOLEIL:Lettre sous la dernière case SOLEItoute autre lettre Saut
Corrigé de l'activité
-
On essaie les positions \(0\) à \(37\), soit \(\mathbf{38}\) positions, pour un total de \(\mathbf{45}\) comparaisons.
-
SOLEILest à la position \(\mathbf{37}\). Presque toutes les positions coûtent une seule comparaison (la première lettre diffère déjà) ; seules les positions \(18\) et \(32\) (unSsuivi d’un espace) en coûtent \(2\), et la position \(37\) en coûte \(6\). -
Environ un million de positions (\(n - m + 1\)) : on essaie toutes les positions, une par une. Si de plus chaque position coûtait plusieurs comparaisons, on atteindrait jusqu’à \(n\times m\) comparaisons.
-
Sous la dernière case (position \(5\) du texte) se trouve un
T, qui n’apparaît pas dansSOLEIL. -
Non : tant que la bande recouvre ce
T, une de ses cases devrait contenirT, ce qui est impossible. On peut donc faire sauter la bande de toute sa longueur, \(\mathbf{6}\) cases, juste après leT. -
À la position \(12\), la dernière case est sur le
I(position \(17\) du texte). Dans la bande,Iest l’avant-dernière case : on avance de \(\mathbf{1}\) case pour les aligner. -
Déroulé complet :
Position Lettre sous la dernière case Comparaisons Saut \(0\) T\(1\) \(6\) \(6\) D\(1\) \(6\) \(12\) I\(1\) \(1\) \(13\) S\(1\) \(5\) \(18\) D\(1\) \(6\) \(24\) A\(1\) \(6\) \(30\) U\(1\) \(6\) \(36\) I\(1\) \(1\) \(37\) L\(6\) trouvé \(\mathbf{9}\) positions essayées et \(\mathbf{14}\) comparaisons. À la position \(13\), le
Sest dans la bande (première case) : on avance de \(5\) pour l’aligner. -
\(14\) comparaisons au lieu de \(45\), plus de trois fois moins. Quand la lettre sous la dernière case n’est pas dans le motif, aucune position recouvrant cette lettre ne peut convenir : les lettres sautées n’ont jamais besoin d’être lues. Plus le motif est long, plus les sauts sont grands.
-
Pense-bête :
S\(\to 5\),O\(\to 4\),L\(\to 3\),E\(\to 2\),I\(\to 1\), toute autre lettre \(\to 6\). PourL, on ne compte pas la dernière case : c’est leLen troisième position qui compte (saut \(3\)). C’est exactement la table de décalage de Horspool, calculée une fois pour toutes avant la recherche (le prétraitement du motif).