Académique Documents
Professionnel Documents
Culture Documents
Le problème est, dans une séquence, de trouver efficacement les occurences d’une
autre séquence, en utilisant des arbres de suffixes.
1 Algorithme direct
Écrire une fonction max_pref(s,m) qui prend en entrée une séquence s et un mot
m et qui retourne le plus long préfixe de m qui est aussi dans s. Évaluer la complexité
temporelle de cette fonction avec pour s la séquence du phage λ.
1
$
$
A
C
A $
T
A $
C
$
2.1 Construction
1. Écrire une méthode a_mot(self, m) de Noeud qui retourne True si l’arbre
représente le mot m.
2. Écrire une méthode prend_mot(self, m) qui complète un arbre pour qu’il
représente le mot m.
Un arbre des suffixes d’une séquence de lettres est un arbre qui représente
tous les suffixes de cette séquence.
Par exemple, pour la séquence ACATAC :
T
A A
C C
$
$
$
A T A C
$
T
C
A $ A
C C T
$ A
2.2 Utilisation
En guise d’exemple, l’arbre de suffixes sera celui de la séquence des 1000 premières
lettre du génome du phage-λ. Attention de ne pas construire l’arbre de suffixes de
tout le génome, cela est trop gros pour la mémoire de l’ordinateur.
2
Le paquetage meliae permet de mesurer la mémoire occupée par des objets
python. Pour cela, on peut faire :
3
réécrire dans les clefs de l’arbre, mais simplement des coordonnées correspondantes
dans la séquence.
Récupérer le fichier :
http://pbil.univ-lyon1.fr/members/gueguen/lib/TP_Algo/noeud_suff.py
qui définit une nouvelle classe Noeud construite comme indiqué ci-dessus.
1. Comparer le temps de création d’un arbre de suffixes avec cette version, par
rapport à la précédente.
En outre, est-ce que la complexité en espace a radicalement dimininué ?
4 Vers le graphe
Dans la fonction max_commun, chaque lettre de seq peut être comparée plusieurs
fois, ce qui n’est pas optimal. Une solution pour palier ce problème est d’ajouter dans
chaque nœud de l’arbre de suffixes, par exemple qui représente le mot m, un pointeur
vers le nœud qui représente le plus long suffixe strict de m dans l’arbre, comme dans
la figure ci-dessous.
T
A A
C C
$
$
$
A T A C
$
T
C
A $ A
C C T
$ A
Cette nouvelle arête correspondra à ce où aller en cas d’échec dans la lecture d’un
mot.
1. Modifier les classes et méthodes de Noeud du fichier noeud_lettre.py pour
qu’un arbre intègre cette information.
En particulier, modifier la méthode suff_seq pour que cette construction soit
efficace (ie elle ne nécessité qu’une lecture directe de la séquence).
2. Dans ce cas, quelle est la complexité de la recherche de plus long mot commun ?