<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Compressed Spaced Sux Arrays</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Travis Gagie</string-name>
          <email>Travis.Gagie@cs.helsinki.fi</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Giovanni Manzini</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Daniel Valenzuela</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Department of Computer Science, University of Helsinki</institution>
          ,
          <country country="FI">Finland</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>University of Eastern Piedmont</institution>
          ,
          <country country="IT">Italy</country>
        </aff>
      </contrib-group>
      <fpage>37</fpage>
      <lpage>45</lpage>
      <abstract>
        <p>Spaced seeds are important tools for similarity search in bioinformatics, and using several seeds together often significantly improves their performance. With existing approaches, however, for each seed we keep a separate linear-size data structure, either a hash table or a spaced sux array (SSA). In this paper we show how to compress SSAs relative to normal sux arrays (SAs) and still support fast random access to them. We first prove a theoretical upper bound on the space needed to store an SSA when we already have the SA. We then present experiments indicating that our approach works even better in practice.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        For the problem of similarity search, we are given two texts and asked to find each
suciently long substring of the first text that is within a certain Hamming distance
of some substring of the second text. Similarity search has many applications
in bioinformatics — e.g., ortholog detection, structure prediction or determining
rearrangements — and has been extensively studied (see, e.g., [
        <xref ref-type="bibr" rid="ref15">19</xref>
        ]). Researchers
used to first look for short substrings of the first text that occur unchanged in the
second text, called seeds, then try to extend these short, exact matches in either
direction to obtain longer, approximate matches. This approach is called, naturally
enough, “seed and extend”. The substrings’ exact matches are found using either
a hash table of the substrings with the right length, or an index structure such as
a sux array (SA).
      </p>
      <p>
        Around the turn of the millenium, Burkhardt and K¨arkk¨ainen [5] and Ma,
Tromp and Li [
        <xref ref-type="bibr" rid="ref11">15</xref>
        ] independently proposed looking for short subsequences of the
first text that have a certain shape and occur unchanged in the second text, and
trying to extend those. A binary string encoding the shape of a subsequence, with
1s indicating positions where the characters must match and 0s indicating
positions where they need not, is called a spaced seed. The total number of bits in
the binary string is called the seed’s length, and the number of 1s is called its
weight. The subsequences’ exact matches are found using either a hash table of
the subsequences with the right shape, or a kind of modified SA called a spaced
sux array [
        <xref ref-type="bibr" rid="ref8">12</xref>
        ] (SSA).
      </p>
      <p>
        Burkhardt and K¨arkk¨ainen, Ma et al. and subsequent authors have shown that
using spaced seeds significantly improves the performance of seeding and
extending. Many papers have been written about how to design spaced seeds to minimize
the number of errors (see, e.g., [
        <xref ref-type="bibr" rid="ref4 ref7">4, 8, 11</xref>
        ] and references therein), with the specifics
depending on the model of sequence similarity and the acceptable numbers of false
positives (for which the characters indicated by 1s all match but the substrings
are not similar) and false negatives (for which those do not all match but the
substrings are still similar) for the application in question. Regardless of the particular
application, however, researchers have consistently observed that the best results
are obtained using more than one seed at a time. A set of spaced seeds used in
combination is called a multiple seed.
      </p>
      <p>
        Multiple seeds are now a popular and powerful tool for similarity search, but
they have a lingering flaw: we keep a hash table or SSA for each seed, and each
instance of these data structures takes linear space. For example, SHRiMP2’s [
        <xref ref-type="bibr" rid="ref3">7</xref>
        ]
index for the human genome takes 16 GB for each seed. In contrast, Bowtie 2’s [
        <xref ref-type="bibr" rid="ref10">14</xref>
        ]
compressed SA for that genome takes only 2.5 GB. This is because a normal SA
(which supports only substring matching) can be compressed such that the number
of bits per character is only slightly greater than the empirical entropy of the text.
Unfortunately, the techniques for compressing normal SAs do not seem to apply
directly to SSAs.
      </p>
      <p>In this paper we show how to compress SSAs relative to normal SAs and still
support fast random access to them. Whereas the normal SA for a text lists the
starting points of the suxes of that text by those suxes’ lexicographic order, the
SSA for a text and a spaced seed lists the starting points of the subsequences with
the right shape by those subsequences’ lexicographic order. Intuitively, if the seed
starts with many 1s, the SSA will be similar to the SA. In Section 2 we formalize
this intuition and prove a theoretical upper bound on the space needed to store an
SSA when we already have the SA, in terms of the text’s length, the alphabet’s
size, and the seed’s length and weight.</p>
      <p>In Section 3 we present experiments showing that our approach works even
better in practice. That is, even when we implement our data structures using
simpler, theoretically sub-optimal components, we achieve better compression than
our upper bound predicts. In fact, in practice we can even successfully apply our
approach in some cases when the assumptions underlying our upper bounds are
violated. However, we still want to improve our compression and random-access
times for seeds with low weight-to-length ratios.</p>
      <p>
        We recently learned that Peterlongo et al. [
        <xref ref-type="bibr" rid="ref13">17</xref>
        ] and Crochemore and Tischler [6]
independently defined SSAs, under the names “bi-factor arrays” and “gapped sux
arrays”, for the special case in which the spaced seed has the form 1a0b1c. Russo
and Tischler [
        <xref ref-type="bibr" rid="ref14">18</xref>
        ] showed how to represent such an SSA in asymptotically succinct
space such that we can support random access to it in time logarithmic in the length
of the text. We note, however, that the spaced seeds used for most applications do
not have this form. We also recently learned that Battaglia et al. [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] used an idea
similar to that of spaced seeds in an algorithm for finding motifs with don’t-care
symbols. It seems possible our results could be useful in reducing their algorithm’s
memory usage.
2
      </p>
      <p>Theory
Suppose we want to store an SSA for a text T [0..n 1] over an alphabet of size and
a spaced seed S with length ` and weight w. For i &lt; n, let Ti be the subsequence
of T [i..n 1] that contains T [j] if and only if i  j and S[j i] = 1. Let Ti0 be the
subsequence of T [i..n 1] that contains T [j] if and only if S[j i] = 0. Let SSA
be the permutation on {0, . . . , n 1} in which i precedes i0 if either Ti Ti0 , or
Ti = Ti0 and T [i..n 1] T [i0..n 1].</p>
      <p>For example, if T = abracadabra and S = 101 then</p>
      <p>T0
T1
T2
T3
T4
T5
= ar
= ba
= rc
= aa
= cd
= aa</p>
      <p>T6
T7
T8
T9
T10
= db
= ar
= ba
= r
= a</p>
      <p>T 0</p>
      <p>0
T 0</p>
      <p>1
T 0</p>
      <p>2
T 0</p>
      <p>3
T 0</p>
      <p>4
T 0
5
= b
= r
= a
= c
= a
= d</p>
      <p>T 0</p>
      <p>6
T 0</p>
      <p>7
T 0</p>
      <p>
        8
T 0
9
= a
= b
= r
= a
and so SSA = [
        <xref ref-type="bibr" rid="ref1 ref2 ref3 ref4 ref5 ref6">10, 3, 5, 7, 0, 8, 1, 4, 6, 9, 2</xref>
        ], while SA = [
        <xref ref-type="bibr" rid="ref1 ref2 ref3 ref4 ref5 ref6">10, 7, 0, 3, 5, 8, 1, 4, 6, 9, 2</xref>
        ].
      </p>
      <p>If Ti Ti0 and Ti0 Ti00 , then i precedes i0 in both SSA and SA. In particular, if
Ti = Ti0 or Ti0 = Ti00 , then i and i0 have the same relative order in SSA and SA. In
our example, T3 = T5 = aa, so 3 precedes 5 in both SSA and SA; T20 = T60 = T90 = a,
so 6 precedes 9 and 9 precedes 2 in both SSA and SA.</p>
      <p>If we partition SSA into subsequences such that i and i0 are in the same
subsequence if and only if Ti = Ti0 , then we can partition SA into the same subsequences.
Since there are at most w + w distinct strings Ti, our partitions each consist of
at most w + w subsequences. Similarly, if we partition based on Ti0 and Ti00 , then
our partitions each consist of at most ` w + ` w subsequences.</p>
      <p>
        For our example, we can partition both SSA and SA into [
        <xref ref-type="bibr" rid="ref2 ref5">4, 6, 9, 2</xref>
        ], for Ti0 = a;
[
        <xref ref-type="bibr" rid="ref3">7, 0</xref>
        ], for Ti0 = b; [3], for Ti0 = c; [5], for Ti0 = d; [
        <xref ref-type="bibr" rid="ref1 ref4">8, 1</xref>
        ], for Ti0 = r; and [
        <xref ref-type="bibr" rid="ref6">10</xref>
        ], for
Ti0 = ✏. In this particular case, however, we could just as well partition both SSA
and SA into only two common subsequences: e.g., [
        <xref ref-type="bibr" rid="ref3 ref6">10, 7, 0</xref>
        ] and [
        <xref ref-type="bibr" rid="ref1 ref2 ref4 ref5">3, 5, 8, 1, 4, 6, 9, 2</xref>
        ].
      </p>
      <p>
        Consider the permutation SA 1 SSA, which maps elements’ positions in SSA to
their positions in SA, and let ⇢ be the minimum number of increasing subsequences
into which SA 1 SSA can be partitioned. Since any subsequence common to SSA
and SA corresponds to an increasing subsequence in SA 1 SSA, we have ⇢ 
min( w +w, ` w +` w). In our example, SA 1 SSA = [
        <xref ref-type="bibr" rid="ref1 ref2 ref3 ref4 ref5 ref6">0, 3, 4, 1, 2, 5, 6, 7, 8, 9, 10</xref>
        ]
and ⇢ = 2.
      </p>
      <p>
        Supowit [
        <xref ref-type="bibr" rid="ref16">20</xref>
        ] gave a simple algorithm that partitions SA 1 SSA into ⇢
increasing subsequences in O(n lg ⇢ ) ✓ O (n min(w, ` w) lg ) time. When applied to
SA 1 SSA in our example, Supowit’s algorithm partitions it into [0, 3, 4] and
[
        <xref ref-type="bibr" rid="ref1 ref2 ref3 ref4 ref5 ref6">1, 2, 5, 6, 7, 8, 9, 10</xref>
        ].
      </p>
      <p>
        Barbay et al. [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] showed how, given a partition of SA 1 SSA into ⇢ increasing
subsequences, we can store it in (2 + o(1))n lg ⇢  (2 + o(1))n min(w, ` w) lg bits
and support random access to it in O(lg lg ⇢ ) time. Combining their ideas with
later work by Belazzougui and Navarro [3], we can keep the same space bound and
improve the time bound to O(1).
      </p>
      <p>To do this, for i  ⇢ , we replace each element in the ith subsequence in SA 1
SSA by a character ai, and store the resulting string R such that we can support
random access to it and partial rank queries on it. We then permute R according
to SA 1 SSA and store the resulting string R0 such that we can support fast
select queries on it. In our example, R = a1a2a2a1a1a2a2a2a2a2a2 and R0 =
a1a1a1a2a2a2a2a2a2a2a2.</p>
      <p>The partial rank query R.p rank(i) returns the number of copies of R[i] in
R[0..i], and the select query R0.selecta(i) returns the position of the ith copy of a
in R0. Barbay et al. noted that, for i &lt; n,</p>
      <p>(SA 1 SSA)[i] = R0.selectR[i](R.p rank(i)) .</p>
      <p>Belazzougui and Navarro showed how we can store R in (1 + o(1))n lg ⇢ bits and
support random access to it and partial rank queries on it in O(1) time, and store
R0 in (1 + o(1))n lg ⇢ bits and support select queries on it in O(1) time.</p>
      <p>In summary, we can store SA 1 SSA in (2 + o(1))n min(w, ` w) lg bits
such that we can support random access to it in O(1) time. We will give a longer
explanation in the full version of this paper. Since SSA = SA (SA 1 SSA), this
gives us the following result:
Theorem 2.1 Let T [0..n 1] be a text over an alphabet of size and let S be a
spaced seed with length ` and weight w. If we have already stored the sux array
SA for T such that we can support random access to SA in time tSA, then we can
store a spaced sux array SSA for T and S in (2 + o(1))n min(w, ` w) lg bits
such that we can support random access to SSA in tSA + O(1) time.
3</p>
      <p>Practice
Theorem 2.1 says we can store SSAs for the human Y-chromosome chrY.fa
in FASTA format (about 60 million characters over an alphabet of size
5) and SHRiMP2’s three default spaced seeds — i.e., 11110111101111,
1111011100100001111 and 1111000011001101111 — in about 560 MB, in addition
to the SA, whereas storing the SSAs na¨ıvely would take about 720 MB. Storing
the SSAs packed such that each entry takes dlg 60 000 000e = 26 bits would reduce
this to about 580 MB.</p>
      <p>To test our approach, we built the SSAs as described in Section 2; computed
SA 1 SSA, R and R0 for each SSA; and stored each copy of R or R0 as a wavelet
tree. We chose wavelet trees because they are simple to use and often more practical
than the theoretically smaller and faster data structures mentioned in Section 2.
We ran all our tests described in this section on a computer with a quad-core Intel
Xeon CPU with 32 GB of RAM, running Ubuntu 12.04. We used a wavelet-tree
implementation from https://github.com/fclaude/libcds and compiled it with
GNU g++ version 4.4.3 with optimization flag -O3.</p>
      <p>The uncompressed SA took 226 MB, and the six wavelet trees took a total
of 215 MB and performed 10 000 random accesses each in 7.67 microseconds per
access. That is, we compressed the SSAs into about 60% of the space it would take
to store them na¨ıvely and, although our accesses were much slower than direct
memory accesses, they were fast compared to disk accesses. Thus, our approach
seems likely to be useful when a set of SSAs is slightly larger than the memory and
fits only when compressed.</p>
      <p>Using the same test setup, we then compressed SSAs for the ten spaced seeds
BFAST [9, Table S3] uses for 36-base-pair Illumina reads, which all have weight
18:
1. 111111111111111111
2. 11110100110111101010101111
3. 11111111111111001111
4. 1111011101100101001111111
5. 11110111000101010000010101110111
6. 1011001101011110100110010010111
7. 1110110010100001000101100111001111
8. 1111011111111111111
9. 11011111100010110111101101</p>
      <p>Since the first seed consists only of 1s, the SSA we would build for it is the same
as the SA. The uncompressed SA again took 226 MB and the 18 wavelet trees for
the other nine seeds took a total of 649 MB — so instead of 2.26 GB, we used
875 MB (about 39%) for all ten seeds — and together performed 10 000 random
accesses to each of the ten SSAs in about 7 microseconds per access. The left side
of the top half of Figure 1 shows how many bits per character (bpc) of the text
each SSA took, and the average time per access to each SSA.</p>
      <p>We also compressed the SSAs for the ten spaced seeds BFAST uses for
50-basepair Illumina reads, which all have weight 22:
1. 1111111111111111111111
2. 1111101110111010100101011011111
3. 1011110101101001011000011010001111111
4. 10111001101001100100111101010001011111
5. 11111011011101111011111111
6. 111111100101001000101111101110111
7. 11110101110010100010101101010111111
8. 111101101011011001100000101101001011101
9. 1111011010001000110101100101100110100111
10. 1111010010110110101110010110111011 .</p>
      <p>Again, the first seed consists only of 1s. This time, the 18 wavelet trees for the
other nine seeds took a total of 712 MB; each access took about 8 microseconds.
The left side of the bottom half of Figure 1 shows how many bit per character of
the text each SSA took, and the average access time per access to each SSA.</p>
      <p>If we have a permutation ⇡ 1 on {0, . . . , n 1} stored and ⇡ 2 is any other
permutation on {0, . . . , n 1}, then we can store ⇡ 2 relative to ⇡ 1 using the ideas from
Section 2. For example, we can store SSAs relative to other SSAs. Suppose we
consider the size of each SSA (except the SA) when compressed relative to each
other SSA (including the SA), build a minimum spanning tree rooted at the SA,
and compress each SSA relative to its parent in the tree. This can reduce our space
usage at the cost of increasing the random-access time, as shown for the BFAST
seeds on the right side of Figure 1.</p>
      <p>
        There are other circumstances in which we can ignore SSAs’ semantics and
consider them only as permutations. For example, spaced seeds can be generalized
to subset seeds [
        <xref ref-type="bibr" rid="ref9">13</xref>
        ], such as ternary strings in which 1s indicate positions where the
characters must match, 0s indicate positions where they need not, and Ts indicate
positions where characters must fall within the same equivalence class (such as
the pyrimidines C and T and the purines A and G). It is not dicult to generalize
Theorem 2.1 to subset seeds — we will do so in the full version of this paper —
but it is also not necessary to obtain practical results. The Iedera tool (available
at http://bioinfo.lifl.fr/yass/iedera.php) generates good subset seeds.
      </p>
      <p>
        A more challenging change is from fixed-length seeds to repetitive seeds [
        <xref ref-type="bibr" rid="ref8">12</xref>
        ]. A
repetitive seed is a string in whose repetition the digits indicate which characters
must match and how. For example, with respect to the repetitive spaced seed
10110, ATCGATCGGT matches ACCGTTGGGA but not ACCGTTGAGA. Repetitive seeds
are useful when looking for approximate matches of substrings that have been
extended until they become suciently infrequent. It is not clear how or if we
can extend Theorem 2.1 to repetitive seeds. Nevertheless, the LAST tool (available
at http://last.cbrc.jp) generates SSAs for repetitive spaced or subset seeds,
which we can still try to compress in practice; see also [
        <xref ref-type="bibr" rid="ref12 ref6">10, 16</xref>
        ].
      </p>
      <p>Our current goal is to achieve reasonable compression and access times for a
set of repetitive subset seeds that we received from Martin Frith, which have
average length 19.85 and average weight about 10.44, counting “same equivalence
class” digits as 0.5. Unfortunately, at the moment we use nearly 24 bits per
entry in the corresponding SSAs (including the overhead for the uncompressed SA),
which is only marginally better than the 26 bits we would use with simple
packing. Meanwhile, random accesses take about 12 microseconds on average, which is
significantly slower than access to a packed array. On the other hand, these seeds
have an unusually low average weight-to-length ratio. We used Iedera and LAST to
generate SSAs for a set of eight repetitive subset seeds, with average length 17.875
and average weight 12. For these, we used only 20.15 bits per entry, with random
accesses taking about 10 microseconds on average.
seed
Acknowledgments
Many thanks to Francisco Claude, Maxime Crochemore, Matei David, Martin
Frith, Costas Iliopoulos, Juha K¨arkk¨ainen, Gregory Kucherov, Bin Ma, Ian Munro,
Taku Onodera, Gonzalo Navarro, Luis Russo, German Tischler and the anonymous
reviewers.</p>
      <p>Computer Science, 410:4327–4340, 2009.
[3] D. Belazzougui and G. Navarro. Alphabet-independent compressed text
indexing. ACM Transactions on Algorithms. To appear.
[4] D. G. Brown. Bioinformatics Algorithms: Techniques and Applications,
chapter A survey of seeding for sequence alignment, pages 126–152.
WileyInterscience, 2008.
[5] S. Burkhardt and J. K¨arkk¨ainen. Better filtering with gapped q-grams.
Fundamenta Informicae, 56:51–70, 2003.
[6] M. Crochemore and G. Tischler. The gapped sux array: A new index
structure for fast approximate matching. In Proceedings of the 17th Symposium on
String Processing and Information Retrieval (SPIRE), pages 359–364, 2010.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>J.</given-names>
            <surname>Barbay</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Claude</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Gagie</surname>
          </string-name>
          , G. Navarro, and
          <string-name>
            <given-names>Y.</given-names>
            <surname>Nekrich</surname>
          </string-name>
          .
          <article-title>Ecient fullycompressed sequence representations</article-title>
          .
          <source>Algorithmica</source>
          . To appear.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>G.</given-names>
            <surname>Battaglia</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Cangelosi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Grossi</surname>
          </string-name>
          , and
          <string-name>
            <given-names>N.</given-names>
            <surname>Pisanti</surname>
          </string-name>
          .
          <article-title>Masking patterns in sequences: A new class of motif discovery with don't cares</article-title>
          .
          <source>Theoretical</source>
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>M.</given-names>
            <surname>David</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Dzamba</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Lister</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Ilie</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Brudno</surname>
          </string-name>
          . SHRiMP2:
          <article-title>Sensitive yet practical short read mapping</article-title>
          .
          <source>Bioinformatics</source>
          ,
          <volume>27</volume>
          :
          <fpage>1011</fpage>
          -
          <lpage>1012</lpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>L.</given-names>
            <surname>Egidi</surname>
          </string-name>
          and
          <string-name>
            <given-names>G.</given-names>
            <surname>Manzini</surname>
          </string-name>
          .
          <article-title>Better spaced seeds using quadratic residues</article-title>
          .
          <source>Journal of Compututer and System Sciences</source>
          ,
          <volume>79</volume>
          :
          <fpage>1144</fpage>
          -
          <lpage>1155</lpage>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>N.</given-names>
            <surname>Homer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Merriman</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S. F.</given-names>
            <surname>Nelson</surname>
          </string-name>
          . BFAST:
          <article-title>An alignment tool for large scale genome resequencing</article-title>
          .
          <source>PLOS One</source>
          ,
          <volume>4</volume>
          :
          <fpage>e7767</fpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>P.</given-names>
            <surname>Horton</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S. M.</given-names>
            <surname>Kielbasa</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M. C.</given-names>
            <surname>Frith</surname>
          </string-name>
          .
          <article-title>DisLex: A tranformation for discontiguous sux array construction</article-title>
          .
          <source>In Proceedings of the Workshop on Knowledge, Language, and Learning in Bioinformatics (KLLBI)</source>
          , pages
          <fpage>1</fpage>
          -
          <lpage>11</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>L.</given-names>
            <surname>Ilie</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ilie</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Khoshraftar</surname>
          </string-name>
          ,
          <article-title>and</article-title>
          <string-name>
            <given-names>A. Mansouri</given-names>
            <surname>Bigvand</surname>
          </string-name>
          .
          <article-title>Seeds for e↵ective oligonucleotide design</article-title>
          .
          <source>BMC Genomics</source>
          ,
          <volume>12</volume>
          :
          <fpage>280</fpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>S. M.</given-names>
            <surname>Kielbasa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Wan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Sato</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Horton</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M. C.</given-names>
            <surname>Frith</surname>
          </string-name>
          .
          <article-title>Adaptive seeds tame genomic sequence comparison</article-title>
          .
          <source>Genome Research</source>
          ,
          <volume>21</volume>
          :
          <fpage>487</fpage>
          -
          <lpage>493</lpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>G.</given-names>
            <surname>Kucherov</surname>
          </string-name>
          , L. No´e, and
          <string-name>
            <given-names>M. A.</given-names>
            <surname>Roytberg</surname>
          </string-name>
          .
          <article-title>A unifying framework for seed sensitivity and its application to subset seeds</article-title>
          .
          <source>Journal of Bioinformatics and Computational Biology</source>
          ,
          <volume>4</volume>
          :
          <fpage>553</fpage>
          -
          <lpage>570</lpage>
          ,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>B.</given-names>
            <surname>Langmeand</surname>
          </string-name>
          and
          <string-name>
            <given-names>S. L.</given-names>
            <surname>Salzberg</surname>
          </string-name>
          .
          <article-title>Fast gapped-read alignment with Bowtie 2</article-title>
          .
          <string-name>
            <given-names>Nature</given-names>
            <surname>Methods</surname>
          </string-name>
          ,
          <volume>9</volume>
          :
          <fpage>357</fpage>
          -
          <lpage>359</lpage>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>B.</given-names>
            <surname>Ma</surname>
          </string-name>
          , J. Tromp, and
          <string-name>
            <given-names>M.</given-names>
            <surname>Li</surname>
          </string-name>
          .
          <article-title>PatternHunter: faster and more sensitive homology search</article-title>
          .
          <source>Bioinformatics</source>
          ,
          <volume>18</volume>
          :
          <fpage>440</fpage>
          -
          <lpage>445</lpage>
          ,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>T.</given-names>
            <surname>Onodera</surname>
          </string-name>
          and
          <string-name>
            <given-names>T.</given-names>
            <surname>Shibuya</surname>
          </string-name>
          .
          <article-title>An index structure for spaced seed search</article-title>
          .
          <source>In Proceedings of the 22nd International Symposium on Algorithms and Computation (ISAAC)</source>
          , pages
          <fpage>764</fpage>
          -
          <lpage>772</lpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>P.</given-names>
            <surname>Peterlongo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Pisanti</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Boyer</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.-F.</given-names>
            <surname>Sagot</surname>
          </string-name>
          .
          <article-title>Lossless filter for finding long multiple approximate repetitions using a new data structure, the bifactor array</article-title>
          .
          <source>In Proceedings of the 12th Symposium on String Processing and Information Retrieval (SPIRE)</source>
          , pages
          <fpage>179</fpage>
          -
          <lpage>190</lpage>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>L. M. S.</given-names>
            <surname>Russo</surname>
          </string-name>
          and
          <string-name>
            <given-names>G.</given-names>
            <surname>Tischler</surname>
          </string-name>
          .
          <article-title>Succinct gapped sux arrays</article-title>
          .
          <source>In Proceedings of the 17th Symposium on String Processing and Information Retrieval (SPIRE)</source>
          , pages
          <fpage>290</fpage>
          -
          <lpage>294</lpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Sun</surname>
          </string-name>
          and
          <string-name>
            <given-names>J.</given-names>
            <surname>Buhler</surname>
          </string-name>
          .
          <article-title>Designing multiple simultaneous seeds for DNA similarity search</article-title>
          .
          <source>Journal of Computational Biology</source>
          ,
          <volume>12</volume>
          :
          <fpage>847</fpage>
          -
          <lpage>861</lpage>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>K. J.</given-names>
            <surname>Supowit</surname>
          </string-name>
          .
          <article-title>Decomposing a set of points into chains, with applications to permutation and circle graphs</article-title>
          .
          <source>Information Processing Letters</source>
          ,
          <volume>21</volume>
          :
          <fpage>249</fpage>
          -
          <lpage>252</lpage>
          ,
          <year>1985</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>