Algorithmie ISI 301 PC 4 : Méthodes de recherche 1 Fonction d
Transcription
Algorithmie ISI 301 PC 4 : Méthodes de recherche 1 Fonction d
Algorithmie ISI 301 PC 4 : Méthodes de recherche 1 Fonction d’adressage Un fonction d’adressage, ou fonction de hashage est une fonction permettant d’associer un entier de [0,N] à un ensemble de données (des chaı̂nes de caractères, par exemple). De façon générale, comme toute donnée en informatique est dénombrable (i.e. toute donnée est représentée par une suite de 0 et de 1), une fonction d’adressage est une fonction de l’ensemble des entiers naturels dans un sousensemble fini d’icelui (qui sera la plupart du temps les entiers de [0, N ], avec N entier). 1.1 Une fonction d’adressage particulière Une bonne fonction d’adressage doit avoir un caractère “aléatoire” pour que les données se répartissent bien entre tous les entiers de [0, N ]. Une fonction très utilisée est la fonction modulo. En prenant deux entiers k et k’, k modulo k’ est égal au reste de la division entière de k par k’. 1.1.1 Implémentez un algorithme permettant de calculer la fonction modulo. Quelle est sa complexité ? 1.1.2 On suppose que chaque lettre de l’alphabet est codée de façon binaire sur 5 bits par sa position dans l’alphabet (00001 pour A, 00101 pour E, etc.). Si l’on veut des entiers entre 0 et 100 (en notation décimale), quelle est l’adresse via la fonction modulo de la chaı̂ne de caractère CLE ? 1.1.3 Que se serait-il passé si l’on avait voulu des entiers entre 0 et 31 ? 1 1.1.4 En utilisant la méthode de Horner (cf. première petite classe) proposez un algorithme permettant de calculer l’adresse d’une chaı̂ne de caractère en utilisant le code précédant (où le code de CLE est égal à 3 ∗ 322 + 12 ∗ 321 + 5 ∗ 320 ) et la fonction d’adressage égale au modulo. 1.2 Fonction d’adressage et dictionnaire Les fonctions d’adressages sont utilisées dans les structures de données appelées dictionnaires. Un dictionnaire peut être vu comme un tableau auquel on accède non pas par des indices, mais par des chaı̂nes de caractères. 1.2.1 En supposant qu’il existe une fonction d’adressage rendant une adresse unique quelque soit la chaı̂ne de caractère, proposez une implémentation d’un dictionnaire. Une telle fonction existe-t-elle ? La méthode est-elle réalisable ? 1.2.2 Comment gérer les chaı̂nes ayant même adresse ? 1.2.3 Quel est l’intérêt d’utiliser ce genre de structure ? 2 Algorithme de Rabin-Karp L’algorithme de Rabin-Karp pour la recherche d’un motif de longueur m dans une chaı̂ne de caractères c1 revient à considérer une fonction d’adressage et de vérifier, pour chaque paquet de m lettres de c1 si l’adresse correspond à celle du motif. On considérera ici que nombre associé à chaque caractère est sa position dans l’alphabet, codé en base d. Dans la partie précédente, d était égal à 32. De même on considère que la fonction d’adressage est la fonction modulo appliquée à un grand nombre premier q. 2.1 On considère que l’on a une fonction φ rendant pour chaque caractère sa position dans l’alphabet. Quelle est le code du mot de longueur m présent à la position i de la chaı̂ne c1 ? 2 2.2 En connaissant le code du mot de longueur m présent à la position i de la chaı̂ne c1 , quelle est le code du mot de longueur m présent à la position i+1 de la chaı̂ne c1 ? 2.3 En connaissant l’adresse du mot de longueur m présent à la position i (c’est à dire l’adresse du code du mot) de la chaı̂ne c1 , quelle est l’adresse du mot de longueur m présent à la position i+1 de la chaı̂ne c1 ? 2.4 En déduire un algorithme permettant de trouver dans une chaı̂ne de longueur n la première position i dont le mot de longueur m commençant à cette position à la même adresse qu’un motif de longueur m. Quel est sa complexité ? 2.4.1 Que reste-t-il à faire pour trouver un motif dans une chaı̂ne de caractère ? 3