indexing biological sequence data - institut gaspard mongekoutcher/lectures/lecture3.pdf ·...

50
Indexing biological sequence data

Upload: others

Post on 18-Mar-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Indexing biological sequence data

Page 2: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Indexing sequence data

!  Large sequence data should be stored into data structures (indexes) that support efficient and fast query and retrieval

!  Example: to implement seed-based similarity search (cf. previous lecture) we need to store k-mer location in a sequence ⇒ hash table

!  What if we need to search for patterns of arbitrary length?

Page 3: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

What is a full-text index?

!  Text index = a data structure built from a given text (string, sequence) that supports certain type of (typically pattern look-up) queries

!  genomic sequences don’t have word structure (cf inverted indexes) and query size is arbitrary (cf hash tables)

!  full-text indexes allow a search for patterns of any length occurring at any position of the text

Page 4: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Plan of lectures

!  “Classical” indexes ─  Suffix trees ─  DAWG and Position heaps ─  Suffix arrays

!  Succinct (compressed) indexes ─  Burrows-Wheeler transform and FM-index

Page 5: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

“Ideal” index structure for T[1..n]

!  Takes space O(n) !  Can be constructed in time O(n) !  All occurrences of a query pattern P can be reported in

time O(|P|+occ)

!  NB: we are interested in indexes stored in main memory

Page 6: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix tree

Page 7: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Trie (aka digital tree)

trie for {agca,acaaa,agcc,aa}

a

a g c

a

a

a

c

a c

•  every string of the set is “spelled” starting from root

•  edges outgoing from a node are labeled by different characters

•  trie can be viewed as an automaton recognizing the given set of strings (or all their prefixes)

Page 8: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix trie

T=acatacagatg$ acatacagatg$ catacagatg$ atacagatg$

tacagatg$ acagatg$

cagatg$ agatg$

gatg$ atg$

tg$ g$

$

1 2 3 4 5 6 7 8 9 10 11 12

12

11

1

a

a

c

$

g t

a c a g a t g $

5

t g $

a 7

t g $

g

a

t

g

9

a

3

a g a t g $

c $

c

a

g

6

a t g $

t

2

a c a g a t g $

g t

$ a

8

t g $

a g

10 $

4

t

c a g a

g $

Page 9: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix trie

T=acatacagatg$ acatacagatg$ catacagatg$ atacagatg$

tacagatg$ acagatg$

cagatg$ agatg$

gatg$ atg$

tg$ g$

$

1 2 3 4 5 6 7 8 9 10 11 12

12

11

1

a

a

c

$

g t

a c a g a t g $

5

t g $

a 7

t g $

g

a

t

g

9

a

3

a g a t g $

c $

c

a

g

6

a t g $

t

2

a c a g a t g $

g t

$ a

8

t g $

a g

10 $

4

t

c a g a

g $

O(n2) nodes anbn

Page 10: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix tree

T=acatacagatg$ 12

11

1

a

a c

$

g t a c a g a t g $

5

t g $

a 7

t g $

g a

t

g

9

a

3

a g a t

g $

c $

c a

g

6

a t

g $

t

2

a c a g

a t g $

g t

$ a

8

t g $

a g

10

$

4

t

c a g a

g $

•  explicit vs implicit nodes •  an edge label is start and end positions of corresponding substring

(rather than substring itself) •  takes space O(n)

Page 11: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Exercise

!  Construct the suffix tree for string 010110011100$

Page 12: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix tree: applications

T=acatacagatg$ 12

11

1

a

a c

$

g t a c a g a t g $

5

t g $

a 7

t g $

g a

t

g

9

a

3

a g a t

g $

c $

c a

g

6

a t

g $

t

2

a c a g

a t g $

g t

$ a

8

t g $

a g

10

$

4

t

c a g a

g $

•  check if a pattern P occurs in T in time O(|P|). Ex: P1=atac P2=c

Page 13: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix tree: applications

T=acatacagatg$ 12

11

1

a

a c

$

g t a c a g a t g $

5

t g $

a 7

t g $

g a

t

g

9

a

3

a g a t

g $

c $

c a

g

6

a t

g $

t

2

a c a g

a t g $

g t

$ a

8

t g $

a g

10

$

4

t

c a g a

g $

•  check if a pattern P occurs in T in time O(|P|). Ex: P1=atac P2=c •  report the number of occurrences in O(|P|) ⇒ preprocess nb of leaves

5

2

2

1

2 2 2

Page 14: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix tree: applications

T=acatacagatg$ 12

11

1

a

a c

$

g t a c a g a t g

5

t g $

a 7

t g $

g a

t

g

9

a

3

a g a t

g $

c $

c a

g

6

a t

g $

t

2

a c a g

a t g $

g t

$ a

8

t g $

a g

10

$

4

t

c a g a

g $

•  check if a pattern P occurs in T in time O(|P|). Ex: P1=atac P2=c •  report the number of occurrences in O(|P|) ⇒ preprocess nb of leaves •  report all occurrences in O(|P|+occ) ⇒ chain leaves and preprocess leftmost and

rightmost leaves

$

Page 15: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix tree: applications

T=acatacagatg$ 12

11

1

a

a c

$

g t a c a g a t g

5

t g $

a 7

t g $

g a

t

g

9

a

3

a g a t

g $

c $

c a

g

6

a t

g $

t

2

a c a g

a t g $

g t

$ a

8

t g $

a g

10

$

4

t

c a g a

g $

•  check if a pattern P occurs in T in time O(|P|). Ex: P1=atac P2=c •  report the number of occurrences in O(|P|) ⇒ preprocess nb of leaves •  report all occurrences in O(|P|+occ) ⇒ chain leaves and preprocess leftmost and

rightmost leaves •  report the first (leftmost) occurrence in O(|P|) ⇒ preprocess minimal leaf label

$

1

1

3 2

8 4

Page 16: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix tree: applications

T=acatacagatg$ 12

11

1

a

a c

$

g t a c a g a t g $

5

t g $

a 7

t g $

g a

t

g

9

a

3

a g a t

g $

c $

c a

g

6

a t

g $

t

2

a c a g

a t g $

g t

$ a

8

t g $

a g

10

$

4

t

c a g a

g $

•  longest repeated substring ⇒ deepest (w.r.t. string depth) internal node in the suffix tree (aca)

3

1 1 1 2

2

Page 17: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix tree: applications

T=acatacagatg$ 12

11

1

a

a c

$

g t a c a g a t g $

5

t g $

a 7

t g $

g a

t

g

9

a

3

a g a t

g $

c $

c a

g

6

a t

g $

t

2

a c a g

a t g $

g t

$ a

8

t g $

a g

10

$

4

t

c a g a

g $

•  longest extension queries: given two positions i,j, output the length of the longest common substring starting at i,j

•  reduces to lowest common ancestor (lca) queries •  lca queries can be answered in O(1) time after linear-time preprocessing

of the tree [Harel,Tarjan 84], [Bender,Farach-Colton 00]

Page 18: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

aeabfbcdgdhdcicba01012123434323210

LCA and RMQ

!  Lowest Common Ancestor (LCA) queries can be easily simulated by 1-dimensional Range Minimum Queries (RMQ)

a

b

c

d

e f g h i

Euler tour (DF traversal) depth array

Page 19: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

LCA and RMQ

!  Lowest Common Ancestor (LCA) queries can be easily simulated by 1-dimensional Range Minimum Queries (RMQ)

a

b

c

d

e f g h i

aeabfbcdgdhdcicba01012123434323210

Euler tour (DF traversal) depth array

LCA(f,h)=b

Page 20: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Exercise

!  Compute maximal repeats

A maximal repeat of T is a substring α that has (at least) two occurrences followed by distinct letters and preceded by distinct letters

Page 21: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix tree: some history

!  Suffix tree can be constructed in time O(n) ─  Weiner 1973: right-to-left construction ─  McCreight 1976: left-to-right ─  Ukkonen 1995: left-to-right and online ─  Farach 1997: for integer alphabets

!  Dan Gusfield, Algorithms on Strings, Trees and Sequences: Computer Science and Computational Biology, Cambridge University Press, 1997

Page 22: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix tree augmented with suffix links

12

11

1

a

a c

$

g t a c a g a t g $

5

t g $

a 7

t g $

g a

t

g

9

a

3

a g a t

g $

c $

c a

g

6

a t

g $

t

2

a c a g

a t g $

g t

$ a

8

t g $

a g

10

$

4

t

c a g a

g $

suf-link(au)=u for explicit nodes au

McCreight and Ukkonen use suffix links

Page 23: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix tree augmented with suffix links

12

11

1

a

a c

$

g t a c a g a t g $

5

t g $

a 7

t g $

g a

t

g

9

a

3

a g a t

g $

c $

c a

g

6

a t

g $

t

2

a c a g

a t g $

g t

$ a

8

t g $

a g

10

$

4

t

c a g a

g $

McCreight and Ukkonen use suffix links

suf-link(au)=u for explicit nodes au

Page 24: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Weiner’s algorithm

Page 25: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Lempel-Ziv encoding

!  used in compression algorithms (compress, gzip, gif, …)

abaabaaabababaabb…!a b a abaa aba baba ab b… !a b (1,1) (1,4) (1,3) (9,4) (1,2) b!

!  compute LZ-encoding (offline) with suffix tree: ─  build suffix tree for T ─  annotate internal nodes by smallest position of a descendant

leaf ─  to compute a new phrase (i,l) starting at position p, match

T[p..] against the suffix tree as long as the min position is smaller than p

Page 26: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Modifications and extensions of suffix tree

!  Generalized suffix tree: suffix tree for several strings (dictionaries)

!  Sparse suffix tree: suffix tree for a fraction of suffixes !  Affix trees: suffix tree for a string and its inverse !  Order-preserving suffix trees: suffix trees for integer

sequences allowing “order-matching search” !  …

Page 27: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

“Suffix-tree-like” data structures: DAWG and position heap

Page 28: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

DAWG: Directed Acyclic Word Graph

!  T[1..n], sub(T) set of substrings of T

!  for u,v∈sub(T), define u≅Tv iff u and v have the same end positions in T ─  Ex: for T=acatacagatg$, aca≅Tca, at≅Tt,

ga≅Tcaga

!  DAWG A is a directed graph (V,E), where V={[u]≅|u∈sub(T)}, E={([u]≅,[ua]≅)| ua∈ sub(T)}

a c a g a t g $

a c a t

t

t

a

c

g g

a

g

$ g

$

T=acatacagatg$

Page 29: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Directed Acyclic Word Graph (DAWG)

[Blumer et al 85] [Crochemore 86] !  DAWG is the minimal automaton recognizing all

suffixes of T !  DAWG has at most 2n nodes and 3n edges !  DAWG can be seen as resulting from a different

compression of suffix trie !  DAWG can be constructed in time O(n) online !  DAWG can be used as a text index to answer

matching queries in time O(|P|) !  DAWG can be augmented with suffix links and can be

used as a matching automaton !  The structure of suffix links of DAWG for T is the same

as the structure of suffix tree for the inverse of T !  DAWG can be extended to (dynamic) dictionaries !  DAWG can be further compressed by compacting

non-branching paths (like suffix tree) T=acatacagatg$

a c a g a t g $

a c a t

t

t

a

c

g g

a

g

$ g

$

Page 30: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Position heap

position heap of T = sequence hash tree of suffixes(T)

suffixes are inserted right to left [Ehrenfeucht et al, 09] suffixes are inserted left to right [Kucherov 11]

acatacagatg$ catacagatg$ atacagatg$

tacagatg$ acagatg$

cagatg$ agatg$

gatg$ atg$

tg$ g$

$

1 2 3 4 5 6 7 8 9 10 11 12

2 1

5 3 6

9

a

c

c

g

t

T=acatacagatg$

12 8 4

7 11 10

$ g

t

g $ a g

All occurrences of a pattern P can be computed in time O(|P|+occ) [Ehrenfeucht et al, 09]

Page 31: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Algorithmic beauty facing rude reality of big data

!  pointer-based structures take too much space for genomic data (O(n) computer words but O(n log(n)) bits)

!  naïve ST implementation requires 5×32=160bits per internal node and at least 32 bits per leaf (for strings non exceeding 232≈4×109 chars)

!  in practice, STs require between 70 and 200 bits/char; this results to 27-80Gb for human genome

!  note that the sequence itself takes 2bits/char !  still, STs are used in practical programs (MUMmer)

Page 32: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix array

Page 33: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix array: definition

acatacagatg$ catacagatg$ atacagatg$

tacagatg$ acagatg$

cagatg$ agatg$

gatg$ atg$

tg$ g$

$

1 2 3 4 5 6 7 8 9 10 11 12

T=acatacagatg$

Page 34: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix array: definition

$ acagatg$ acatacagatg$ agatg$ atacagatg$ atg$ cagatg$ catacagatg$ g$ gatg$ tacagatg$ tg$

12 5 1 7 3 9 6 2 11 8 4 10

T=acatacagatg$

Page 35: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix array: definition

$ acagatg$ acatacagatg$ agatg$ atacagatg$ atg$ cagatg$ catacagatg$ g$ gatg$ tacagatg$ tg$

12 5 1 7 3 9 6 2 11 8 4 10

T=acatacagatg$ SA

Suffix array (SA) is a permutation of the positions of T taken in the lexicographical order of corresponding suffixes

T[SA[i]..n]<lexT[SA[i+1]..n]

[Manber, Myers 90] [Gonnet, Baeza-Yates, Snider 92]

Page 36: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

String matching with suffix arrays

$ acagatg$ acatacagatg$ agatg$ atacagatg$ atg$ cagatg$ catacagatg$ g$ gatg$ tacagatg$ tg$

12 5 1 7 3 9 6 2 11 8 4 10

T=acatacagatg$ SA •  For any substring, its occurrences

form an interval of SA •  Interval [LP,RP] for P can be found

by two binary searches •  Search for LP:

aca

ca

while l<r do m=⎣(l+r)/2⎦ if P >lexT[SA[m]..n]

then l≔m+1 else r≔m

•  the whole search for P takes time O(m·log(n))

1 2 3 4 5 6 7 8 9 10 11 12

Page 37: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

String matching with suffix arrays

$ acagatg$ acatacagatg$ agatg$ atacagatg$ atg$ cagatg$ catacagatg$ g$ gatg$ tacagatg$ tg$

12 5 1 7 3 9 6 2 11 8 4 10

T=acatacagatg$ SA •  LCP[i] = length of the longest

common prefix between suffixes starting at SA[i] and SA[i-1]

•  Note: the longest common prefix between any two suffixes SA[i] and SA[j] can be computed in constant time after a linear-time preprocessing of LCP array. (Use range minimum queries)

•  using LCP array, interval search time O(m·log(n)) can be turned into O(m+log(n))

-1 0 3 1 1 2 0 2 0 1 0 1

LCP

1 2 3 4 5 6 7 8 9 10 11 12

Page 38: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

String matching with suffix arrays

$ … aaaga… … … … … … … … aacccac… …

P=aacccaa •  assume we know lcpl=LCP(sufl,P),

lcpr=LCP(sufr,P) and assume lcpl<lcpr .. .. l .. .. .. … .. .. .. r ..

SA

sufl=

sufr=

lcpl

lcpr

notation: sufi=T[i..n]

Page 39: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

String matching with suffix arrays

$ … aaaga… … … … aaccaca… … … … aacccac… …

P=aacccaa •  assume we know lcpl=LCP(sufl,P),

lcpr=LCP(sufr,P) and assume lcpl<lcpr •  consider sufm and consider LCP(sufm,sufr)

..

.. l .. .. .. m .. .. .. r ..

SA

sufl=

sufm=

sufr=

lcpl

lcpr

Page 40: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

$ … aaaga… … … … aaccaca… … … … aacccac… …

String matching with suffix arrays

P=aacccaa •  assume we know lcpl=LCP(sufl,P),

lcpr=LCP(sufr,P) and assume lcpl<lcpr •  consider sufm and consider LCP(sufm,sufr)

•  Case 1: LCP(sufm,sufr)<lcpr

Then P >lexsufm, LCP(sufm,P)=LCP(sufm,sufr)and we set l≔m for the next iteration

..

.. l .. .. .. m .. .. .. r ..

SA

sufl=

sufm=

sufr=

lcpl

lcpr

Page 41: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

String matching with suffix arrays

P=aacagac •  assume we know lcpl=LCP(sufl,P),

lcpr=LCP(sufr,P) and assume lcpl<lcpr •  consider sufm and consider LCP(sufm,sufr)

•  Case 2: LCP(sufm,sufr)>lcpr

Then P <lexsufm, LCP(sufm,P)=lcpr and we set r≔m for the next iteration

..

.. l .. .. .. m .. .. .. r ..

SA

sufl=

sufm=

sufr=

lcpl

lcpr

$ … aaaga… … … … aaccaca… … … … aacccac… …

Page 42: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

$ … aaaga… … … … aaccaca… … … … aacccac… …

String matching with suffix arrays

P=aaccagc •  assume we know lcpl=LCP(sufl,P),

lcpr=LCP(sufr,P) and assume lcpl<lcpr •  consider sufm and consider LCP(sufm,sufr)

•  Case 3: LCP(sufm,sufr)=lcpr

Then we keep comparing chars of P with those of sufm until P[j]≠sufm[j] which determines if P≤lexsufm or P>lexsufm, and also the value LCP(sufm,P)

..

.. l .. .. .. m .. .. .. r ..

SA

sufl=

sufm=

sufr=

lcpl

lcpr

Page 43: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

$ … aaaga… … … … aaccaca… … … … aacccac… …

String matching with suffix arrays

P=aaccagc •  assume we know lcpl=LCP(sufl,P),

lcpr=LCP(sufr,P) and assume lcpl<lcpr •  consider sufm and consider LCP(sufm,sufr)

•  Case 3: LCP(sufm,sufr)=lcpr

Then we keep comparing chars of P with those of sufm until P[j]≠sufm[j] which determines if P≤lexsufm or P>lexsufm, and also the value LCP(sufm,P)

..

.. l .. .. .. m .. .. .. r ..

SA

sufl=

sufm=

sufr=

lcpl

lcpr

Page 44: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

String matching with suffix arrays

P=aaccagc •  assume we know lcpl=LCP(sufl,P),

lcpr=LCP(sufr,P) and assume lcpl<lcpr •  consider sufm and consider LCP(sufm,sufr)

•  Case 3: LCP(sufm,sufr)=lcpr

Then we keep comparing chars of P with those of sufm until P[j]≠sufm[j] which determines if P≤lexsufm or P>lexsufm, and also the value lcpm=LCP(sufm,P)

..

.. l .. .. .. m .. .. .. r ..

SA

sufl=

sufm=

sufr=

lcpm

lcpr

$ … aaaga… … … … aaccaca… … … … aacccac… …

Page 45: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

String matching with suffix arrays

P=aaccagc •  assume we know lcpl=LCP(sufl,P),

lcpr=LCP(sufr,P) and assume lcpl<lcpr •  consider sufm and consider LCP(sufm,sufr)

•  Case 3: LCP(sufm,sufr)=lcpr

Then we keep comparing chars of P with those of sufm until P[j]≠sufm[j] which determines if P≤lexsufm or P>lexsufm, and also the value lcpm=LCP(sufm,P)

Conclusion: at each step we either do binary division, or move one char forward in the pattern ⇒ time O(|P|+log(n))

..

.. l .. .. .. m .. .. .. r ..

SA

sufl=

sufm=

sufr=

lcpm

lcpr

$ … aaaga… … … … aaccaca… … … … aacccac… …

Page 46: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Construction of suffix array

!  construction in O(n·log(n)) [Manber, Myers 90] !  bad option: construct the suffix tree, then extract the

suffix array !  construction in O(n) [Kärkkäinen, Sanders 03] [Ko,

Aluru 03] [Kim et al 03] !  works on practical linear-time construction of suffix

array: [Nong et al 09]

Page 47: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix array and suffix tree

12

11

1

a

a c

$

g t a c a g a t g

5

t g $

a 7

t g $

g a

t

g

9

a

3

a g a t

g $

c $

c a

g

6

a t

g $

t

2

a c a g

a t g $

g t

$ a

8

t g $

a g

10

$

4

t

c a g a

g $

$

$ acagatg$ acatacagatg$ agatg$ atacagatg$ atg$ cagatg$ catacagatg$ g$ gatg$ tacagatg$ tg$

12 5 1 7 3 9 6 2 11 8 4 10

T=acatacagatg$

SA

-1 0 3 1 1 2 0 2 0 1 0 1

LCP

SA ∼ leaf labels left-to-right provided that children of any node are ordered according to the order of characters

LCP ∼ string length of lowest common ancestor (lca)

Page 48: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Enhanced suffix arrays

12

11

1

a

a c

$

g t a c a g a t g

5

t g $

a 7

t g $

g a

t

g

9

a

3

a g a t

g $

c $

c a

g

6

a t

g $

t

2

a c a g

a t g $

g t

$ a

8

t g $

a g

10

$

4

t

c a g a

g $

$ T=acatacagatg$

-1 0 3 1 1 2 0 2 0 1 0 1

LCP

•  LCP array encodes the tree topology of ST: internal node ≈ interval LCP[i..j] s.t. min{LCP[i+1..j]}=q and LCP[i]<q, LCP[j+1]<q

•  on LCP and SA arrays, one can simulate bottom-up and top-down navigation in ST, as well as suffix links [Abouelhoda et al 04]

Page 49: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Enhanced suffix arrays

12

11

1

a

a c

$

g t a c a g a t g

5

t g $

a 7

t g $

g a

t

g

9

a

3

a g a t

g $

c $

c a

g

6

a t

g $

t

2

a c a g

a t g $

g t

$ a

8

t g $

a g

10

$

4

t

c a g a

g $

$ T=acatacagatg$

-1 0 3 1 1 2 0 2 0 1 0 1

LCP

•  LCP array encodes the tree topology of ST: internal node ≈ interval LCP[i..j] s.t. min{LCP[i+1..j]}=q and LCP[i]<q, LCP[j+1]<q

•  on LCP and SA arrays, one can simulate bottom-up and top-down navigation in ST, as well as suffix links [Abouelhoda et al 04]

Page 50: Indexing biological sequence data - Institut Gaspard Mongekoutcher/lectures/lecture3.pdf · Indexing sequence data ! Large sequence data should be stored into data structures (indexes)

Suffix arrays: practical issues

!  SA is a popular data structure that provides a space-efficient alternative to ST

!  Enhanced suffix arrays take 40-72 bits/char, this results to 15-27Gb for human genome

!  Enhanced SAs are used in practical bioinformatics software (Vmatch,segemehl,Fiona)

!  Efficient SA construction is an active area of research (external memory, parallelization, …)

!  Compressed suffix arrays [Grossi,Vitter 00] (different structures surveyed in [Navarro, Makinen 07])