Árvores de Sufixo Jeane Cecília Roteiro Definição Aplicações Construção Algoritmo de McCreight Exemplo Outros Algoritmos Árvores de Sufixo Estrutura de dados que permite a representação de todos os sufixos de um determinado string S. Pode ser construída em tempo O(|S|). Permite a localização de um padrão p em tempo O(|p|). Árvore de Sufixo Árvore enraizada, com n folhas. Cada aresta é rotulada por um substring de S. Arestas que saem de um vértice devem ter rótulos com prefixos diferentes. Cada folha corresponde a um sufixo de S. Árvore para abd abd 1 d bd 2 3 Árvore para bbabd d 5 b 3 d babd 1 abd abd 2 4 Árvore para aabbabd a d b abbabd d b abd babd d babd Aplicações de Árvore de Sufixo Encontrar todas as ocorrências de um padrão (sequenciamento de DNA em Larga escala). Encontrar todas os substrings que contém um padrão (localização de primers). Encontrar o maior substring comum aos strings S e T (tempo O(|S| + |T|). Construção de Árvores de Sufixo Algoritmo de McCreight Mapeamento de um string finito S em uma árvore T. Caminhos em T são sufixos de S. Nós terminais de T são posições de S. Tempo: O(n log||) Algoritmo de McCreight Restrições Uma aresta de T pode representar qualquer substring não vazio de S. Cada nó não terminal de T deve ter pelo menos dois filhos (exceto a raiz). O caractere final de S não pode aparecer em outra parte deste. Árvore para aabbabd a d b abbabd d b abd babd d babd Definições Caminho parcial Caminho Qualquer caminho a partir da raiz Caminho parcial que finaliza em um nó terminal Locus Nó final de um caminho parcial b abab... b2 b ab b3 b ababb... b4 b babab... bbaa... abab... ababb... ababb... S = b5abab3a2b5c Definições = abbab Extensão de Locus estendido de Qualquer string do qual é um prefixo: abbab****** Locus (definido) da menor extensão de Locus contraído de Locus (definido) do maior prefixo de Definições attgacgattc head7 = ga suf7 = gattc tail7 = ttc suf i : sufixo de S. head i : maior prefixo de sufi que também é prefixo de sufj (j<i). tail i = sufi-headi Idéia Geral do Algoritmo No passo i é inserido o sufi na árvore Ti-1, obtendo a árvore Ti. Procedimento Localiza o locus estendido de headi em Ti-1. Constrói um novo nó terminal para ser o locus de headi (caso este não exista) Acrescenta uma aresta rotulada taili, ligando o locus de headi a um novo nó terminal. T2 T3 babc ab ababc babc 2 1 2 abc 1 c 3 Busca pelo locus estendido de headi Se headi-1 pode ser escrito como a , então é prefixo de headi. Suffix link: liga o locus de x ao locus de . gtagcagtcgcagtcggacgagca sufi-1 sufi sufj-1 sufj b abab... b2 b ab b3 b ababb... b4 b babab... bbaa... abab... ababb... ababb... S = b5abab3a2b5c function fastfind (v:node; p:string):no; { p está contido em algum caminho iniciado em v } begin A partir de v, siga o caminho rotulado por p ; compare apenas o primeiro símbolo de cada aresta. Seja (w,) o último nó implícito; se = então return w; senão return break(w, ); end function slowfind (v:node; p:string):no; begin A partir de v, siga o caminho rotulado pelo maior prefixo de p, letra por letra. Seja (w,) o último nó implícito; se = então return w; senão return break(w, ); end a a a b b ea ea dc ea b b b a a a b dc dc b a Último nó implícito d b a c d b c a O nó criado break(w,ab) = find(v,p) b a d c Algoritmo McCreight; begin T := árvore com dois nós e uma aresta rotulada p1 for i:=2 to n do begin /* insere o proximo sufixo pi*/ rótulo da aresta (pai[headi-1], headi-1) rótulo da aresta (headi-1, leafi-1) u:= suf[pai[headi-1]]; v:= fastfind (u, ); Se v tem apenas 1 filho então {v é um nó recentemente inserido} headi := v Senão headi := slowfind(v, ); Suf[headi]:=v; Crie uma nova folha leafi; Faça leafi como filha de headi; Rotule a aresta (headi,leafi) de acordo; end; end. a u Pai i-1 Head i-1 Fastfind(u,) v 1 12 headi 2 Folha i-1 leafi Slowfind(v, ) Outros Algoritmos Algoritmo de Weiner Incremental (como o de McCreight) Processa o texto da direita para a esquerda Busca a partir do prefixo (+ complexo) Algoritmo de Ukkonen Construção da árvore on-line Tempo linear (alfabeto fixo)