Travail Pratique – Conception et analyse d’algorithmes Algorithme Shift-Or Travail Pratique – Conception et analyse d’algorithmes
Plan de la rencontre Problème algorithmique Grands principes utilisés Exemple de fonctionnement Exemple d’application Implémentation
Problème algorithmique Il y a un problème qui revient souvent, réussir à trouver une expression dans un texte. En effet, on a les recherches sur internet qui doivent être précise pour relever les expressions les logiciels proposent des façons de retrouver instantanément un mot dans l’interface en cours Il faut également que les logiciels suggèrent des recherches et pour ça, il faut aussi trouver le plus rapidement possible une expression dans un texte. Il est donc primordial de pouvoir trouver rapidement des chaines de caractère pour un grand nombre d’application. Plusieurs façons de régler ce problème sont avancées, mais nous nous attarderons sur la méthode Shift-Or dans ce texte.
Description générale Rechercher un expression E[1…m] dans un texte T[1…n]. On fait une comparaison entre tous les éléments et on place le résultat dans un tableau m x n. Il faut ensuite vérifier la présence de 0 sur la dernière ligne dans le tableau de comparaison. Étant donné que c’est une comparaison qui est fait, la grandeur et le type d’alphabet n’a aucune importance.
const char *Shift_Or(const char *text, const char *pattern) { const char *result = NULL; int m = strlen(pattern); BIT *R; int i, k; if (pattern[0] == '\0') return text; R = malloc((m+1) * sizeof *R); R[0] = 1; for (k=1; k <= m; ++k) R[k] = 0; for (i=0; text[i] != '\0'; ++i) { for (k=m; k >= 1; --k) R[k] = R[k-1] && (text[i] == pattern[k-1]); if (R[m]) { result = (text+i - m) + 1; break; } free(R); return result;
Histoire du problème Arrivée des chaînes de caractères Propose différentes avenues et possibilités Comment bien exploiter ces possiblités ? Plusieurs algorithmes Concaténation Comparaison Division La recherche devenait nécessaire
Histoire de l’algorithme Inventé il y a plus de 40 ans Autres noms : Bitap Baeza-Yates-Gonnet Dates importantes : 1964 – Invention de Shift-Or pour la recherche de chaînes exactes inventé par M. Balint Dömölski (Expert informatique) 1977 – Algorithme Shift-Or pour la recherche de chaînes exactes complété par M. R.K. Shyamasundar 1991 – L’algorithme est repris pour la recherche de chaînes brouillées par M. Udi Manber (VP Google) 1996 – Amélioration de l’algorithme M. Navarro 1998 – Adaptation de l’algorithme pour les chaînes de caractères très longues par M. Gene myers (Chercheur algorithmie et bio-informatique)
L’état de l’art Le problème est encore analysé par les universités, les chercheurs et les informaticiens Plusieurs livres existent : An algorithm for syntactical analysis, Balint Dömölski Fast text searching with allowing errors, Udi Manber ... Implémentation gratuite disponible : Libbitap Connu comme étant l’algorithme sous la fonction “agrep” de Unix Plusieurs implémentation disponibles État actuel de l’algorithme Shift-Or Rechercher des chaînes de caractères, courtes ou longues, à l’intérieur d’une grande chaîne de caractères. La version connue aujourd’hui permet également la recherche d’une chaîne presque identique à celle recherchée. Ce n’est pas fini -> L’informatique ne cesse d’évoluer Études pour améliorer la performance de cet algorithme. Utilisation dans Unix (agrep) = bonne garantie de survie et d’amélioration
Grands Principes Utilisés Utilise quelques grands principes algorithmique Le plus grand principe est le compromis espace- temps Création d’un tableau de comparaisons; Il apparaît un « 1 » si : Le caractère actuel ne concorde pas ; Le caractère actuel concorde, mais le précédent ne concordait pas. Il apparaît un « 0 » si le caractère actuel concorde et que le précédent concorde aussi Analyse du dit tableau de comparaisons. Nous vérifions s’il y a la présence d’un « 0 » dans la dernière rangée.
Grands Principes Utilisés Il y a aussi la comparaison qui est grandement utilisée à plusieurs étapes : Comparaisons des caractères lors de la création du tableau de comparaisons; Vérification de la présence d’un « 0 » dans la dernière rangée du tableau.
Exemple de fonctionnement Chaîne de départ : « BONJOUR LE MONDE ! » Chaîne à trouver : « MONDE » Puisque nous avons une valeur à « 0 » dans la dernière ligne, nous pouvons affirmer que la chaîne a effectivement été trouvée, et ce, très rapidement! B O N J U R L E M D ! 1 Tableau 1 – Exemple de fonctionnement
Exemple d’application L’utilisation de l’algorithme Shift-Or peut être appliqué à plusieurs situations où la recherche d’une chaîne de caractère est requise: Recherche d’un terme dans un texte (comme dans Word); Recherche d’une série de caractères dans un navigateur web (entre autres avec la coloration de recherche). Image 1 – Exemple de recherche dans un navigateur web.
Analyse de l’algorithme Aucune récursivité Théorème du maximum Appels à diverses fonctions (par exemple : strlen) Une boucle pour initialiser le tableau (s’exécute en O(m)) B0ucles imbriquées pour effectuer la recherche S’exécute en O(mn) en pire cas pour un mot de longueur “n” et un nombre de “m” vérifications S’exécute en O(m) en meilleur cas (mot d’une lettre ou vide)
Implémentation Implémentation en C Comparaison des temps empiriques Démonstration
Comparaison des algorithmes Shift-Or Boyer–Moore String.h