• Aucun résultat trouvé

Construction des index

identiques successives. Des facteurs identiques auront probablement la même annota- tion : il serait intéressant de profiter des remarques précédentes pour rapprocher des annotations identiques grâce à la BWT. Nous allons donc stocker les annotations dans l’ordre de la BWT dans un nouvel index, nommé TLBW-index, représenté dans la

figure 4.4.

Dans cet index, les requêtes sur les motifs annotés seront rapides car lettres et annotations sont rangées dans le même ordre. Mais les requêtes sur les annotations devront passer par le WT puis par la BWT, pour trouver les positions des annotations dans l’ordre du texte T , augmentant leur temps d’exécution.

4.2

Construction des index

Cette section décrit la construction du TL-index et du TLBW-index puis indique

leur temps de construction et la mémoire qu’ils occupent.

TL-index

Soit (T, A), un texte annoté, nous définissons le TL-index comme (U, BA, WA),

utilisant une transformée de Burrows-Wheeler U pour indexer T , un vecteur de bits BA marquant les positions du texte où les annotations changent, et un Wavelet Tree

WA indexant une séquence d’annotations compressée de la même manière que pour le

HT-index. Voir figure 4.6.

BWT U . Soit U = u0u2. . . un−1 la BWT du texte T . Comme habituellement fait dans

un FM-index, nous échantillonnons toutes les log1+ valeurs d’une table des suffixes pour retrouver la position dans le texte de toute occurrence [34]. Depuis la position d’une lettre dans U , nous pouvons trouver sa position dans l’ordre du texte T en temps O(log+1n).

Vecteur de bits BA. Soit BAun vecteur de bit compressé de taille n tel que BA[0] = 1,

et pour i ≥ 1, BA[i] = 0 si ai = ai−1, sinon BA[i] = 1.

Wavelet Tree WA. Soit A0 = hai|BA[i] = 1i. A0 = a00a01. . . a0a−1 est appelé la sé-

quence d’annotations compressée. C’est un sous-vecteur de A, de taille a, conte- nant seulement les annotations successives différentes de A. La séquence d’annotations

58 CHAPITRE 4 : INDEXATION DE SÉQUENCES ANNOTÉES

compressée A0 est stockée dans un Wavelet Tree WA. Nous expliquons dans la sec-

tion 4.4 comment la forme de WA peut être modifiée de manière à dépendre d’une

hiérarchie d’annotations.

WA fait partie de la structure d’indexation. Ce wavelet tree est utilisé pour ré-

pondre efficacement à des requêtes bidimensionnelles où le texte et les annotations sont les deux dimensions. Un Wavelet Tree équilibré a une profondeur de log `, avec ` le nombre de feuilles. L’accesseur Whii renvoie a0i en temps O(log `). C’est une requête classique dans un wavelet tree. Soit Lx une annotation de L, la fonction select(Lx, i)

retourne la position de la ième annotation Lx de A0 en temps O(log `). L’accesseur

W−1hLxi renvoie la liste de positions de A0 où a0i = Lx. Il est effectué en temps

O(log ` × occ), où occ est le nombre d’occurrences de Lx dans A0.

A0 L1.2 L2 ε L3 L1.1 ε L2 ε WA q0 1 1 0 1 1 0 1 0 1 6 ε q1 00100 0101 L3 q2 10 L2 q3 L1.1 L1.2 U C C T C $ A A C $ $ G A T A G A A T A T C T A A C A G C $ A T C A A C $ A G C T T T $ A L1.2 L1.2 L1.2 L2 L2 L2 ε L3 L3 L3 L1.1 L1.1 L1.1 ε L2 L2 L2 ε ε ε ε BA 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 3 4 5 14 15 16

Figure 4.6 : Le wavelet tree WAa 4 nœuds internes et 5 feuilles. L’annotation a3 = L2

est stockée dans A0 à la position 1, donc Wh1i = a01 = L2. A0 possède deux

occurrences de l’annotation L2 : W−1hL2i = {1, 6}, correspondant aux six

positions {3, 4, 5, 14, 15, 16} dans A. Notons que la séquence d’annota- tions A et la séquence d’annotations compressée A0 ne sont pas stockées dans l’index.

4.2 CONSTRUCTION DES INDEX 59

TLBW-index

Soit (T, A) un texte annoté, le TLBW-index est défini par (U, BD, WD), voir figure

4.7. La BWT U est construite de la même manière que dans le TL-index. Nous stockons les annotations dans l’ordre de U . Soit D = d0d1. . . dn−1 les annotations de U =

u0u1. . . un−1. Soit BD, un vecteur de bits de taille n tel que BD[0] = 1, et pour i ≥ 1,

BD[i] = 0 si di = di−1, sinon BD[i] = 1. Soit D0 = hdi|BD[i] = 1i. D0 = d00, d 0 1. . . d

0 d−1

est une séquence d’annotations compressée de taille d, sous-séquence de D. Le wavelet Tree WD indexe maintenant la séquence d’annotations compressée D0. Le TLBW-index

sera plus long à construire que le TL-index car la construction de D nécessite de lire le texte intégralement. D’un autre côté, comme les annotations sont rangées dans l’ordre des lettres de la BWT, les requêtes combinant texte et annotation seront plus rapides.

D0 L2 L1.1 ε L3 ε L1.1 L1.2 ε L2 L1.1 L3 L1.2 L2 ε L3 ε L2 WD q0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 0 1 6 11 ε q1 001000010010 100010011 L3 q2 00101 L2 q3 L1.1 L1.2 U D BD C L2 1 C L1.1 1 T ε 1 C L3 1 $ ε 1 A L1.1 1 A L1.2 1 C L1.2 0 $ ε 1 $ ε 0 G L2 1 A L1.1 1 T L3 1 A L1.2 1 G L2 1 A L2 0 A L2 0 T ε 1 A L3 1 T ε 1 C L2 1 0 20 6 7 13

Figure 4.7 : La racine D0 du wavelet tree est maintenant construite dans l’ordre de la BWT U . Le wavelet tree WD a 4 nœuds internes et 5 feuilles. L’annota-

tion d6 = L2 est stockée dans D0 à la position 6, donc Wh6i = d06 = L1.2.

D0 a deux occurrences de l’annotation L1.2 : W−1hL1.2i = {6, 11} corres-

pondant aux trois positions {6, 7, 13} dans U . Notons que la séquence d’annotations D et la séquence d’annotations compressée D0 ne sont pas stockées dans l’index.

60 CHAPITRE 4 : INDEXATION DE SÉQUENCES ANNOTÉES

Temps et mémoire

Rappelons que le texte annoté (T, A) de longueur n, possède `0 facteurs anno- tés provenant de ` annotations uniques. Comme défini dans la section 2.5, les in- dex stockent U en nHk(T ) + o(n) bits. Le TL-index stocke le vecteur de bits avec

les fonctions rank et select en nH0(BA) + o(n) bits (voir section 2.4.2). La taille de

WA dépend de la séquence d’annotations compressée A0, de longueur a. WA utilise

aH0(A0)+o(a log `) bits (voir section2.4.2). De la même manière, le TLBW-index stocke

BD en nH0(BD) + o(n) bits et WD nécessite dH0(D0) + o(d log `) bits, où d est la lon-

gueur de D0. La table d’association est construite en lisant A en temps O(n) et utilise O(`0) bits. La transformée de Burrows-Wheeler peut être construite en temps linéaire en utilisant peu d’espace [3, 31]. BA est construit en lisant A en temps O(n). Pour fa-

briquer BD, nous avons besoin de lire les annotations dans l’ordre du texte original en

temps O(n). Pour construire WA, nous trouvons les occurrences de chaque annotation

correspondant à un bit 1 dans BA, en temps O(a). Ensuite nous fabriquons la forme de

WA en temps O(`). Les annotations correspondant à un bit 1 sont extraites pour faire

la racine q0 du WT. Pour chaque nœud contenant au moins deux annotations, nous

les séparons en suivant la forme précédemment calculée, en temps O(adlog `/√log ae) [32]. Nous construisons WD de la même manière.

Le HT-index a une taille totale de nHk(T ) + nH0(BA) + a + `0 + o(n) et est

construit en temps O(n log `0). Le TL-index a une taille totale de nHk(T ) + nH0(BA) +

aH0(A0) + o(n log `) bits, en supposant que σ = O(`), et est construit en temps O(n +

`+adlog `/√log ae). Le TLBW-index a une taille totale de nHk(T )+dH0(D0)+o(n log `)

bits et est construit en temps O(n + ` + ddlog `/√log de).

Documents relatifs