TD5 Algorithmes et Complexité Algorithmes sur les séquences Michel Van Caneghem 8 janvier 2003 1. Un alignement En utilisant un score de 1 pour une égalité, -1 pour une différence et -2 pour un gap, donnez les meilleurs alignement globaux des 2 séquences suivantes : AAAG ACG 2. Alignement local Quel est le meilleur alignement local des 2 séquences suivantes : ATACTACGGAGGG GAACGTAGGCGTAT On utilisera les mêmes paramètres que la question précédente. 3. Combien Vous avez vu en cours l’algorithme classique de programmation dynamique pour aligner deux séquences d’ADN ou d’acides aminés. On cherche à aligner deux séquences de taille m et n (m < n). Exprimer en fonction ! ! − x x − de n et m le nombre d’alignements distincts possibles. On considèrera les alignements : et y − − y comme identiques. 4. L’algorithme de Hirschberg Il s’agit de l’algorithme qui permet de construire un alignement en utilisant un espace linéaire. (a) Soit deux séquences S et T de longueur m et n. Trouvez un algorithme qui utilise un espace au plus O(m) et qui permet de calculer le score optimal de l’alignement d’une séquence qui est un préfixe de S avec tous les préfixes de T . Quelle est sa complexité en nombre de comparaisons. Même chose pour un alignement entre un suffixe de S et tous les suffixes de T . (b) Pour comprendre l’algorithme, imaginons l’alignement optimal qui passe par le symbole s[i]. En face de ce symbole on trouve soit le symbole t[j], soit un gap entre t[j] et t[j + 1]. Si on représente l’alignement optimal entre x et y par : ! x optimal y alors on a les deux choix suivants : optimal s[1..i − 1] t[1..j − 1] ! s[1..i − 1] t[1..j] ! et optimal + + s[i] + optimal t[j] s[i] + optimal − s[i + 1..m] t[j + 1..n] ! s[i + 1..m] t[j + 1..n] ! Montrez que quand on connait i alors on peut trouver j de manière linéaire en espace. (c) Comprendre alors l’algorithme suivant Align(1,m,1,n) qui construit l’alignement optimal avec une utilisation de la mémoire linéaire en m ou n. Remarque : on peut partir du milieu i de la séquence s, on en déduit j. Et on rappelle récursivement soit Align(1,i/2 - 1,1,j - 1) et Align(i/2 + 1,m,j + 1,n) soit Align(1,i/2 - 1,1,j) et Align(i/2 + 1,m,j + 1,n) (d) Notons T (m, n) le nombre de fois ou l’on appelle max dans la fonction "MeilleurScore". Montrez que : T (m, n) <= mn + T (m/2, j) + T (m/2, n − j) Puis par récurrence que T (m, n) <= 2mn) C’est à dire que l’on arrive à une utilisation d’un espace linéaire, en ne faisant pas plus de 2 fois le nombre de comparaisons de l’algorithme qui utilise un espace mémoire en O(mn). 5. Un petit programme Ecrire un programme qui réalise la rotation vers la gauche de I positions des N éléments d’un tableau X. rotation("ABCDEFGH",3) = "DEFGHABC" Ce programme doit s’exécuter en un temps proportionnel à N, en utilisant seulement quelques mots de mémoire supplémentaire. Une aide : On peut remarquer que si l’on dispose du sous-programme renverse(i,j) qui renverse les éléments du sous tableau X[i]...X[j] alors le programme est pratiquement fini. ABCDEFGH -> renverse(1,3) -> CBADEFGH CBADEFGH -> renverse(3+1,8) -> CBAHGFED CBAHGFED -> renverse(1,8) -> DEFGHABC Voici le programme correspondant (d’après le livre : Introduction to Computational Molecular Biology) : 1 8 janvier 2003 TD5 Algorithmes et Complexité 2