Compressing Suffix Trees by Path Decompositions
Abstract
The suffix tree is arguably the most fundamental data structure on strings: introduced by Weiner (SWAT 1973) and McCreight (JACM 1976), it allows solving a myriad of computational problems on strings in linear time. Motivated by its large space usage, subsequent research focused first on reducing its size by a constant factor via Suffix Arrays, and later on reaching space proportional to the size of the compressed string. Modern compressed indexes, such as the -index (Gagie et al., JACM 2020), fit in space proportional to , the number of runs in the Burrows-Wheeler transform (a strong and universal repetitiveness measure). These advances, however, came with a price: while modern compressed indexes boast optimal bounds in the RAM model, they are often orders of magnitude slower than uncompressed counterparts in practice due to catastrophic cache locality. This reality gap highlights that Big-O complexity in the RAM model has become a misleading predictor of real-world performance, leaving a critical question unanswered: can we design compressed indexes that are efficient in the I/O model of computation?
We answer this in the affirmative by introducing a new Suffix Array sampling technique based on particular path decompositions of the suffix tree. We prove that sorting the suffix tree leaves by specific priority functions induces a decomposition where the number of distinct paths (each corresponding to a string suffix) is bounded by . This allows us to solve indexed pattern matching efficiently in the I/O model using a Suffix Array sample of size at most , strictly improving upon the (tight) bound of Suffixient Arrays, another recent compressed Suffix Array sampling technique.
Experiments confirm that this theoretical I/O efficiency translates to practice in pangenomic applications: our index locates pattern occurrences using less space and orders of magnitude less time than the -index when performing pattern matching on repetitive DNA collections. Beyond this, our contributions are twofold: (i) unlike Suffixient Arrays, our technique supports most standard suffix tree operations in space on top of the text while matching the I/O complexity of uncompressed suffix trees; and (ii) we establish a general framework where any valid path decomposition induces a Suffix Array sampling whose size is a new strong repetitiveness measure; we provide a universal mechanism for locating all pattern occurrences for each such path decomposition.
Keywords and phrases:
Text indexing, suffix tree, I/O-efficient, Compressed Data StructuresCategory:
Track A: Algorithms, Complexity and GamesFunding:
Travis Gagie: Funded by NSERC (Discovery Grant RGPIN-07185-2020).Copyright and License:
Sung-Hwan Kim, Giovanni Manzini, and Nicola Prezza; licensed under Creative Commons License CC-BY 4.0
2012 ACM Subject Classification:
Theory of computation Pattern matching ; Theory of computation Data structures design and analysis ; Theory of computation Data compressionSupplementary Material:
Software (Source Code): https://github.com/regindex/STPD-index [3]archived at
swh:1:dir:d4f76a2be744c622f98d403443e3f4507ae9b536
Funding:
Ruben Becker, Davide Cenzato, Sung-Hwan Kim, and Nicola Prezza: Funded by the European Union (ERC, REGINDEX, 101039208). Views and opinions expressed are however those of the author(s) only and do not necessarily reflect those of the European Union or the European Research Council Executive Agency. Neither the European Union nor the granting authority can be held responsible for them.Ruben Becker and Giovanni Manzini: Funded by INdAM-GNCS (INdAM-GNCS Project CUP E53C25002010001).
Editors:
Sayan Bhattacharya, Danupon Nanongkai, Michael Benedikt, and Gabriele PuppisSeries and Publisher:
Leibniz International Proceedings in Informatics, Schloss Dagstuhl – Leibniz-Zentrum für Informatik
1 Introduction
In this paper, we describe a new elegant and very efficient paradigm to solve the well-studied problem of compressing suffix trees. Suffix trees were introduced in 1973 by Weiner [48] and revisited (in their modern form) in 1976 by McCreight [36] to solve string processing problems such as finding longest common substrings and matching patterns on indexed text in linear time. The latter problem (indexed string matching) asks to build a data structure on a text of length over alphabet of size so that later (at query time), given a string (the pattern) of length , the following can be returned: (1) one exact occurrence of in if any exists (find queries), (2) all exact occurrences of in (locate queries), or (3) the number of exact occurrences of in (count queries). While being extremely fast due to excellent query-time cache locality, suffix trees require a linear number of words to be stored in memory regardless of the input compressibility and are therefore not suitable to nowadays massive-data scenarios such as pan-genome indexing (where one aims at indexing terabytes of data in the form of repetitive collections of thousands of genomes). This problem was later mitigated by Suffix Arrays [35, 34, 22], which use only a constant fraction of the space of suffix trees while supporting (cache-efficiently) a subset of their functionality, still sufficient to support pattern matching queries.
Subsequent research succeeded (spectacularly) in reducing the space usage of suffix trees and Suffix Arrays to the bare minimum needed to store the compressed text. Notable contributions in this direction include the compressed Suffix Array (CSA) [23], FM-index [18], run-length compressed Suffix Array [33], run-length FM-index [32], -index [21], Lempel-Ziv-based [29] and indexes based on straight-line programs (SLPs) [14] (and their variants), and the more recent -SA [26]. See the survey of Navarro [39] for an extensive treatment of the subject. While the first line of work (CSA and FM-index) focused on entropy compression, the subsequent works mentioned above switched to text compressors capable of exploiting the repetitiveness of the underlying text sequence (a source of redundancy that entropy compression is not able to exploit). Among those, the -index [20, 21] and its improvements [41, 7, 51] stood out for its optimal linear-time pattern matching query time and its size – linear in the number of equal-letter runs in the Burrows-Wheeler transform (BWT) of the text. These works on repetition-aware compressed text indexes spurred a very fruitful line of research on compressibility measures (the survey of Navarro [38] covers the subject in detail), culminating in recent breakthroughs [27, 25] which showed that is a strong and universal repetitiveness measure, being equivalent to all other known compressibility measures (such as the size of the Lempel-Ziv factorization [31], normalized substring complexity [28], and straight-line programs) up to a multiplicative polylogarithmic factor. Altogether, these results laid the theoretical foundations for subsequent works in computational pan-genomics that showed how the run-length encoded BWT can successfully be used to index very large collections of related genomes in compressed space [45, 16, 44, 2, 46, 1].
1.1 Are repetition-aware data structures just a theoretical tool?
Modern compressed indexes such as the -SA of Kempa and Kociumaka [26] support random access and pattern matching queries, but their time complexities depend on a high polynomial of the logarithm of the text’s length, which makes them hardly practical. Indexes based on the Lempel-Ziv factorization or on grammar compression mitigate this problem (even reaching optimal search time [13]), but rely on complex and cache-inefficient data structures that, again, make them orders of magnitude slower than simple suffix trees in practice. The -index (in its modern version [41]) uses words of space and solves find, locate, and count queries in time (assuming constant alphabet for simplicity), plus the number of occurrences to be reported (if any). While this is essentially the end of the story in the word RAM model, it does not take into account caching effects. As a matter of fact, each of the steps of the backward search algorithm of the -index and of its predecessor (the FM-index [18]) triggers I/O operations (that is, likely cache misses). While this issue was later partially addressed by the move structure of Nishimoto and Tabei [41], that solution still triggers cache misses. This does not happen with the suffix tree:
Remark 1.
To see this, observe that path compression makes it possible to compare (a substring of) the pattern with the label of an edge of length with I/O complexity. In particular, each of the edge traversals triggers at least one I/O operation in the worst case. The additive term is negligible in practice as in most interesting scenarios the suffix tree tends to branch mostly in the highest levels (we investigate this effect in the full version of this paper [4]). For instance, if the text is uniform then with high probability since the longest repeated substring’s length is w.h.p.
The performance gap in the I/O model between compressed indexes and the suffix tree shows up dramatically in practice: a simple experiment (see [4]) shows that, while the -index is orders of magnitude smaller than the suffix tree on very repetitive inputs, it also solves queries orders of magnitude slower. The same holds true for all the existing compressed indexes using a space close to that of the -index. This reality gap highlights that Big-O complexity in the RAM model has become a misleading predictor of real-world performance in the context of compressed data structures, leaving a critical question unanswered:
Can compressed indexes be efficient in the I/O model of computation?
1.2 Our contributions
We answer this question in the affirmative by introducing a novel compressed sampling of the Prefix Array. In one configuration, our sampling requires at most samples to resolve pattern matching queries via a simple binary search strategy, assuming random access to the text is available. Since random access in compressed space is a well-studied problem [8, 29, 6, 30] (see also [38] for a survey on the topic), this requirement does not limit our strategy. On the contrary, unlike existing compressed indexes, our approach is flexible enough to utilize any random access compressed data structure.
By incorporating additional data structures, we achieve our main result: a compressed suffix tree topology occupying only words of space on top of a (potentially compressed) text oracle that still efficiently supports most standard navigation queries:
Theorem 2.
Let be a text of length over an integer alphabet of size . Assume we have access to an oracle supporting longest common extension () and random access queries (extraction of one character) on in time. Then, there is a representation of ’s suffix tree using words on top of the text oracle and supporting these queries:
-
in time: the suffix tree root.
-
in time: the child of node by letter .
-
in time: the alphabetically-smallest label among the outgoing edges of .
-
in time: given node and a character labeling one of the outgoing edges of , return the successor of (in alphabetic order) among the characters labeling outgoing edges of (return if no such label exists).
-
in time: given an edge , return such that the edge’s label is .
-
, in time: the leftmost/rightmost leaves of the subtree rooted in a given node .
-
: if is a leaf, return the next leaf in lexicographic order; we support following a sequence of leaf pointers in time.
-
in time: the text position of a given leaf (representing suffix ).
-
in time: the string depth of node .
-
in time: whether is an ancestor of .
If the text oracle also supports computing a collision-free (on text substrings) hash of any text substring in time (an operation we call fingerprinting), then can be supported in time within the same asymptotic space.
The same asymptotic bounds apply to I/O complexity if and represent I/O costs rather than time.
A subset of the above queries suffices to navigate the suffix tree (a task at the core of several string-processing algorithms) and to solve pattern matching queries. For example, using the cache-efficient text representation of Prezza [42], supporting with I/O complexity, fingerprinting with I/O complexity, and extraction of contiguous characters with I/O complexity on polynomial alphabets, we obtain the following:
Corollary 3.
Let be a text of length over an integer alphabet of size . The topology of ’s suffix tree can be compressed in words on top of a text representation [42] of bits so that all the occurrences of any pattern of length can be located with I/O complexity, where is the node depth of in the suffix tree and is the number of integers fitting in an I/O block.
That is, the same I/O complexity of Weiner and McCreight’s suffix tree up to a logarithmic factor multiplying (see Remark 1). At the same time, the space usage on top of the text is reduced from to words ( is orders of magnitude smaller than on very repetitive inputs [21]). Furthermore, the term can be replaced by with a different technique (Theorem 40; this is important since in typical applications, holds).
Using up-to-date cache-efficient compressed data structures, we show experimentally that an optimized implementation of our fully-compressed index is simultaneously smaller and orders of magnitude faster than the -index on the task of locating all pattern occurrences on a highly repetitive collection of genomes.
1.3 Improvements over related techniques
Suffixient Array.
Our approach is most closely related to the Suffixient Array [10], another recent compressed sampling of the Prefix Array. We strictly improve upon the Suffixient Array in three dimensions:
-
Functionality. Unlike Suffixient Arrays, which are limited to pattern matching, our sampling retains the topological structure of the suffix tree. Consequently, we support a much broader range of suffix tree operations efficiently.
-
Locating Efficiency. Suffixient Arrays return an arbitrary pattern occurrence, offering no control over which one is found. To locate all occurrences starting from an arbitrary position , one requires bidirectional navigation (both and ), costing about words of auxiliary space [21]. In contrast, one of the configurations of our index guarantees returning the first pattern occurrence in Suffix Array order. This allows us to locate all remaining occurrences using only unidirectional successor Suffix Array queries (i.e., retrieving given ) with words of auxiliary space [21].
Compressed Suffix Trees.
Gagie et al. [21] previously addressed compressed suffix trees in space bounded by a function of , showing that full functionality is possible in space with logarithmic operation time. When augmented with a I/O efficient text oracle, their theoretical I/O complexity for pattern matching matches our Corollary 3; however, their approach consumes significantly more space on top of the oracle ( vs ). Furthermore, their structure relies on complex machinery atop a grammar-compressed Suffix Array; to our knowledge, it has never been implemented, likely due to the practical reality that Suffix Arrays do not compress as effectively as the text itself via grammar compression.
Other I/O Efficient Solutions.
Other works in the literature addressed the I/O-efficiency of full-text indexes. Chien et al. [12] introduced the Geometric Burrows-Wheeler Transform, which connects range searching with text indexing to provide compressed indexing techniques and theoretical lower bounds within the I/O model. Their solution, however, achieves I/O-efficient performance only in the uncompressed setting. Similarly, Ferragina and Venturini [19] proposed a compressed version of the string B-tree, adapting classical external-memory string structures to use compressed space while remaining efficient across memory hierarchies. While their compressed cache-oblivious string B-Tree supports I/O-efficient prefix search and enumeration, its space for locate queries remains proportional to the number of suffixes.
As far as fully-compressed space is concerned, several recent works have targeted the I/O bottleneck of the -index. The Move structure of Nishimoto and Tabei [41] reduces the I/O operations of the -index by a factor by replacing predecessor queries with pointers. However, it retains a worst-case complexity of I/O operations. While practical implementations [51, 7] are roughly an order of magnitude faster than the standard -index, they require significantly more space. Similarly, Puglisi and Zhukova [43] applied relative Lempel-Ziv compression to a transformed Suffix Array. While this yields good memory locality and query speeds in practice, it lacks formal guarantees and increases the space usage of the -index by an order of magnitude, again suffering from the poor compressibility of the Suffix Array relative to the text.
2 Order-preserving Suffix Tree Path Decompositions
Due to space limitations, we assume the reader to be already familiar with the following standard concepts: right-maximal strings, lexicographic and colexicographic order, longest common suffix/prefix function / between strings, Suffix Array, suffix tree, and Burrows-Wheeler transform. See the full version [4] for the formal definitions.
Definition 4 (, , and ).
Let be a string of length . The right (left) longest common extension function () is the function that, for two distinct integers , returns (). A longest common extension () oracle is an oracle that supports both and queries for the string .
When clear from the context, we simply write and instead of and .
Our work can be interpreted as a generalization of suffix sorting: by sorting the text’s suffixes according to any priority function (permutation) satisfying a natural and desirable order-preserving property (see Definition 5), we obtain a compressed index that keeps track of the pattern occurrence minimizing among all pattern occurrences. Figure 1 broadly introduces our solution. Intuitively, we (i) sort the suffix tree’s leaves according to , (ii) we build a suffix tree path decomposition (STPD for brevity) prioritizing the paths with smaller , and (iii) we path-compress the STPD paths by just recording their starting position in the text. At this point, we show that the colexicographically-sorted Path Decomposition Array of those positions (a sample of the Prefix Array) can be used to obtain a new elegant, simple, and remarkably efficient compressed suffix tree.
As introduced above, the starting point of our technique is the choice of a priority function (permutation) that we use to generalize suffix sorting. In this paper, we focus on permutations possessing the following natural property.
Definition 5 (Order-preserving permutation).
Let be a string and be a permutation. The permutation is said to be order-preserving for if and only if implies for all .
The above property is sufficient and necessary to guarantee the following desirable universal minimization property: if are two pattern occurrences, then either holds for all or for none. In Lemmas 15 and 41 we will show that the lexicographic rank of suffixes, the colexicographic rank of prefixes, and the identity function are order-preserving permutations (but not the only ones).
Suffix tree path decomposition.
A suffix tree path decomposition (STPD) is an edge-disjoint collection of node-to-leaf paths covering all the suffix tree’s edges built as follows. Since we will never start a path on an implicit suffix tree node, we can equivalently reason about path decompositions of the suffix trie. We describe how to obtain the STPD associated with a given order-preserving permutation , as we believe this will help the reader to better understand our technique. Then, we will make the construction fully formal. Let be a text. Imagine the process of inserting ’s suffixes (for ) in a trie in order of increasing . The path associated with the first suffix in this order is the one starting in the root and continuing with characters . When inserting the -th () suffix , let be the longest common prefix between the -th suffix and all the previous suffixes in the order induced by . The corresponding new path in the decomposition is the one starting in the suffix tree locus of string and labeled with string . In other words, the path associated with is its suffix that “diverges” from the trie containing the previous suffixes in the order induced by . See Figure 1, where leaves (suffixes) are sorted left-to-right in order of increasing where .
The core of our indexing strategy is to store in a colexicographically-sorted array all the distinct integers obtained in this process (that is, the starting positions of paths in ). We now formalize this intuition. Due to space limitations, most proofs are deferred to the full version of this article [4].
and arrays.
We first introduce the concept of the Generalized Longest Previous Factor Array . Intuitively, this array stores the lengths of the longest common prefixes of a string’s suffixes in the order induced by . It generalizes the well-known Permuted Longest Common Prefix () array (when taking to be the lexicographic rank of the text’s suffixes) and the array (when taking to be the identity function).
Definition 6 (Generalized Longest Previous Factor Array ).
Let be a string and be a permutation. The generalized Longest Previous Factor array associated with and is the integer array that, for , is defined as:
Definition 7 (Path Decomposition Array ).
Let be a string and be an order-preserving permutation. The (suffix tree) Path Decomposition Array associated with and is the set sorted in colexicographic order of the corresponding string’s prefixes .
It will always be the case that the indexed string is fixed in our discussion, so we will simply write and instead of and , respectively. When also is clear from the context, we will write and .
Example 8.
Consider the STPD of Figure 1. In this example, is the rank of leaf in lexicographic order (in other words, ): . Then, the array corresponds to the array: . For instance, because and the suffixes with are those starting in positions . Among those, the one with the longest common prefix with is , and their longest common prefix is .
At this point, the sequence for is equal to . The Path Decomposition Array is the array containing the distinct values in such a sequence, sorted colexicographically: (that is, precedes in the order if and only if is colexicographically smaller than ).
The STPD associated with and the corresponding array are said to be order-preserving if is order-preserving.
The expert reader might have noticed that, for the permutation used in Example 8, the values in are in a one-to-one correspondence with the irreducible LCP values. As a matter of fact, our technique generalizes the notion of irreducible values to any array such that is order-preserving. First, note that the array is almost nondecreasing:
Lemma 9.
For any string , if is order-preserving then for every . In particular, the sequence , for , is nondecreasing.
Values where the inequality of Lemma 9 is strict are of particular interest:
Definition 10 (Irreducible position).
Let be a string and be an order-preserving permutation. We say that is an irreducible position if and only if either or .
It is a simple observation that is equivalent to , from which we obtain:
Remark 11.
For any order-preserving permutation , , hence is equal to the number of irreducible positions (since contains distinct values).
The following lemma generalizes the well-known relation between irreducible values and the Burrows-Wheeler transform [24, Lemma 4] in more general terms.
Lemma 12.
Let be a string and be an order-preserving permutation. Let moreover be an irreducible position. Then, for every with and , it holds that .
Lemma 13 formalizes the following intuitive fact about order-preserving STPDs. Consider an STPD built on string using order-preserving permutation . If for a suffix tree node , the three nodes , , and belong to the same STPD path (for some ), then for any other outgoing label of node , string suffixes at least one sampled prefix , for some .
Lemma 13.
Let be a string and be an order-preserving permutation.
For and such that occurs in , let . Then, for any characters such that both and occur in and , there exists such that is suffixed by .
We conclude with the following result, implying that is a reachable compressibility measure for any order-preserving .
Theorem 14.
Let be a string over integer alphabet and let be an order-preserving permutation. Then, can be compressed in bits of space.
Proof.
(Sketch) For each irreducible position , we store a quadruple , where is the source of , that is, any integer with and . This set of quadruples takes bits of space by Remark 11, and we can reconstruct any character given by recursively following the source position.
We proceed as follows. First, we discuss the notable order-preserving permutation given by the lexicographic rank of the text’s suffixes (Section 2.1). This permutation will enable us to support most suffix tree operations in space on top of the text oracle. Then, in Section 2.2 we describe a general locating mechanism working on any order-preserving STPD. After that, we focus on the colexicographic rank of the text’s prefixes (Section 2.3). This case is particularly interesting because it allows us to simplify the locating algorithm of Section 2.2, and will lead to a practical solution. Finally, in Section 2.4 we consider yet another remarkable order-preserving permutation: identity. This permutation will allow us to locate efficiently the leftmost and rightmost pattern occurrences.
2.1 Lexicographic rank (): suffix tree navigation
Figure 1 depicts the STPD obtained by choosing to be the Inverse Suffix Array (in this subsection, will always be equal to ). We denote with the path decomposition array associated with this permutation . Similarly, denotes the path decomposition array associated with the dual permutation . The following properties hold:
Lemma 15.
Let be a text. The permutations defined as and for are order-preserving for . Furthermore, it holds that and .
2.1.1 Data structure
Let be a text. We describe a data structure of space supporting the suffix tree queries of Theorem 2 on top of any text oracle supporting Longest Common Extension (and, optionally, fingerprinting) queries on . We store the following components.
-
(1)
The array containing the integers sorted increasingly according to the colexicographic order of the corresponding text prefixes (if , then is the empty string). Note that, by Lemma 15, it holds that .
-
(2)
Let be a new character not appearing in (taken to be larger than all the characters in ). We store a string defined as:
We store with a wavelet tree [37], taking space and supporting rank and select operations in time.
-
(3)
The string obtained by sorting lexicographically the characters of . We store with a wavelet tree supporting rank and select operations in time.
-
(4)
Let and be the permutations of defined as follows. For any integers , if is the -th occurrence of in and is the -th occurrence of in , then and (note that ). and can be evaluated in time with rank and select operations on and .
Definition 16.
We denote with the permutation of defined as follows: for any , or, equivalently (since and are inverse of each other), .
We store one Range Minimum and one Range Maximum data structure on the array , supporting queries in constant time in bits of space (we do not need to store explicitly).
Remark 17.
While this is not fundamental for our discussion below, it may be helpful from an intuitive point of view to observe that string , once removed character from it, is a subsequence of length of the colexicographic Burrows-Wheeler transform (). Similarly, permutations and are the counterpart of functions and typically used with the BWT.
2.1.2 Node representation
Suffix tree navigation operations are supported on a particular representation of (explicit) suffix tree nodes that we describe next. First, Lemma 13 immediately implies:
Corollary 18.
Let be an explicit suffix tree node and be such that . Then, suffixes for at least one value .
In the Following, we describe our representation of suffix tree nodes.
Definition 19 (Suffix tree node representation).
We represent suffix tree node with the tuple of integers
-
is the colexicographic range of in (by Corollary 18, always holds);
-
is the occurrence of minimizing , that is, is the lexicographically-smallest suffix prefixed by ;
-
is the occurrence of maximizing , that is, is the lexicographically-largest suffix prefixed by ; and
-
is the string depth of .
Remark 20.
Observe that . In particular, if then . Since corresponds to the text’s prefix (the empty string), in this case because the empty string is smaller than any other text prefix. In that case, because (ending with ) is the second colexicographically-smallest sampled prefix. If, on the other hand, , then .
Based on the above remark:
Definition 21.
We denote with the integer such that .
Letting be a leaf, observe that ends with character . It follows that the colexicographic range of in is . This will be used later.
2.1.3 Suffix tree operations
Next, we show how to support a useful subset of suffix tree operations on our data structure. This will prove Theorem 2. In the description below, suffix tree operations will take as input node representations () instead of nodes themselves (). Recall that we are assuming we have access to a text oracle supporting longest common extension () and random access queries on in time and fingerprinting queries in time.
Root.
Let be the suffix tree root. returns in time, where is the lexicographically-smallest text suffix and is the lexicographically-largest text suffix (in other words, and ).
String depth.
Let . Then, returns in time.
Ancestor
Let and . If , cannot be an ancestor of so returns false. Otherwise, returns true if and only if , that is, if and only if the string with is a prefix of with . This operation runs in time.
Is leaf.
Let . Then, returns true (in time) if and only if , if and only if (see Definition 21), if and only if the string with ends with , that is, (equivalently, ).
Locate leaf.
Let . The output of is defined only if is true. In that case, returns () in time.
Leftmost/rightmost leaves.
Let . Then, in time we can compute and .
Edge label.
Let be a suffix tree edge, with and . Then, returns in time.
Next leaf.
Nishimoto and Tabei [41] showed that, starting from , consecutive applications of the permutation defined below111This permutation is usually denoted as . Here we instead use the symbol . can be computed in time with a data structure using words of space.
Definition 22 (-function).
Let be defined as
Observe that, by the definition of , leaf is the next leaf in lexicographic order after leaf (unless the latter is the suffix tree’s rightmost leaf).
Let be a leaf, with (see Definition 21 for the definition of ). Then, unless is the rightmost leaf, . It follows that the structure of Nishimoto and Tabei can be used to evaluate consecutive applications of in time.
Smallest children label and successor child.
Let be a node with . Operation returns the alphabetically-smallest label in (i.e., in ). Operation returns the alphabetically-smallest label in () being larger than . Both queries reduce to an orthogonal range successor (also known as range next value) query in the range , an operation that can be solved in time on wavelet trees [37]. In both queries, if then we simply ignore it.
Child by letter.
The function is the most technically-interesting operation. Let be a node with and be a letter. Let be such that . Lemma 13 implies the following corollary:
Corollary 23.
Let , and let be the range containing the text positions such that is suffixed by . All (and only) the letters labeling the outgoing edges from node appear in , that is, .
Following Corollary 23, if (a test taking time using rank and select operations on ), then we can return , signaling that no outgoing edge from is labeled with .
Otherwise, we first show how to compute and such that and are the lexicographically-smallest and lexicographically-largest suffixes being prefixed by , respectively. After that, we show how to use this information to compute .
Due to space constraints, we provide only the outlines here. The detailed description can be found in the full version [4].
Observe that , since is an explicit suffix tree node. We distinguish three cases. (i) is neither the alphabetically-largest nor the alphabetically-smallest label in , i.e. and hold; (ii) is the alphabetically-smallest label in , i.e., ; (iii) is the alphabetically-largest label in , i.e., .
To simplify the discussion below, we rephrase Lemma 13 to the particular STPDs we are using in this section (i.e. those derived from and ):
Corollary 24.
Let be right-maximal, and let be the range containing the text positions such that is suffixed by . Let moreover be the set of all the characters extending in the text. Then:
-
(a)
Let , and let be the lexicographically-smallest suffix being prefixed by . Then, .
-
(b)
Let , and let be the lexicographically-largest suffix being prefixed by . Then, .
We now show how to compute and . The three cases are considered as follows:
-
(i)
By Corollary 24, , where and are the lexicographically smallest and largest suffixes being prefixed by , respectively. We locate the leftmost and rightmost occurrences of letter in using rank/select operations on , in time. We apply to locate corresponding ’s in . Range minimum/maximum queries in range followed by applying , and can be retrieved. Then we obtain and .
-
(ii)
We can find following the same procedure described in (i) above (resorting to Range Maximum Queries). And since is the lexicographically-smallest suffix being prefixed by , we have and .
-
(iii)
Symmetric to (ii).
If , is a leaf, thus we simply return the tuple . If (i.e., is not a leaf), note that is the string depth of . In particular, , where .
Simple binary search can compute such that for all , is a suffix of , with random access queries. If the text oracle supports queries in time, this process can be done in time . With z-fast tries [5, 9] on , we can find in time (I/O operations, resp.) where is the time (I/O complexity, resp.) for fingerprinting.
We finally have all ingredients to return our result: .
Putting everything together.
2.2 General locating mechanism for order-preserving STPDs
In this subsection we provide a general locating mechanism working on any order-preserving STPD. First, we show how to locate the pattern occurrence minimizing among all pattern occurrences. We call this occurrence primary. Then we show that, starting from the (unique) primary occurrence, we can locate the remaining ones (called secondary) by resorting to orthogonal point enclosure. As a matter of fact, this technique generalizes the -index’ function (Definition 22, cases and ) to arbitrary order-preserving permutations. This increased generality with respect to Section 2.1, comes at the price of not being able to support suffix tree queries (only pattern matching).
After this section, we will tackle the particular case (colexicographic order of the text’s prefixes), for which the locating algorithm that we describe here can be simplified. That particular case will lead to our optimized implementation able to beat the -index both in query time (by orders of magnitude) and space usage.
For the remainder of the section, we assume is a text and is any order-preserving permutation on . We start by classifying the occurrences of a pattern as follows.
Definition 25 (Primary/Secondary occurrence).
For a string , an occurrence is said to be a primary occurrence if and only if . All the other occurrences are called secondary occurrences.
Lemma 26.
For any string that occurs in there exists exactly one primary occurrence . Furthermore, such occurrence is the one minimizing .
2.2.1 Finding the primary occurrence
The idea to locate the primary pattern occurrence is simple and can be visualized as a process of walking along the paths of the STPD, starting from the root. Whenever we find a mismatch between the pattern and the current STPD path, we change path by running a suffix search (e.g. binary search) on . We first provide an intuition through an example (Example 27). Our algorithm is formalized in Algorithm 1. Then, we prove the algorithm’s complexity, correctness, and completeness.
Example 27.
Consider the STPD of Figure 1, and let be the query pattern. We start by matching with the characters of the path starting at the root. The longest pattern prefix matching the path is (the empty string). To continue matching , we need to change path. We binary search looking for a sampled text prefix being suffixed by (i.e. the concatenation of the pattern’s prefix matched so far and the first unmatched pattern’s character). Two sampled prefixes (elements in ) satisfy this requirement: and . By definition of our STPD, among them we need to choose the one minimizing . This choice can be performed in constant time with the aid of a Range Minimum Query data structure built on top of . Such prefix minimizing is . This means that we choose an STPD path labeled with . Observe that this also means that is the lexicographically-smallest occurrence of . We repeat the process, matching the remaining characters of . As can be seen in Figure 1 characters match (purple path starting below the root). Then, the path continues with and the pattern with . As done above, we binary search looking for a sampled text prefix being suffixed by . Now, only one sampled prefix matches: , corresponding to an STPD path labeled with . Observe that this means that is the lexicographically-smallest occurrence of being preceded by ; in other words, is the lexicographically-smallest occurrence of . We therefore continue matching the remaining pattern’s suffix on . This time, the whole pattern’s suffix matches, hence we are done. Since the last binary search returned the sampled text’s prefix , and before running the search we already matched , we return pattern occurrence which, by construction of our STPD and by the order-preserving property of , is the lexicographically-smallest one (in this example, also the only one).
Data structures and search algorithm.
We show that, interestingly, a small modification of the search algorithm of Suffixient Arrays [10] (see Appendix A in the full version [4]) allows locating the primary pattern occurrence on any order-preserving STPD. The search algorithm is sketched in Example 27 and formalized in Algorithm 1. We need the following data structures:
- (i)
- (ii)
-
(iii)
A text oracle supporting random access on . To speed up we may also require the oracle to support and/or fingerprinting queries on (we obtain different performance depending on which queries are available, read below).
Complexity.
As observed above, the operation in Line 6 takes just time using a Range Minimum data structure built over . For the analysis of , we provide only the summarized result here due to space constraints. The detailed analysis is available in the full version [4]. If we use binary search on and a random access oracle on that supports the extraction of contiguous text characters with I/O complexity, then can be solved with I/O complexity. If the random access oracle supports , this can be done in time (respectively, I/O complexity), where is the time complexity (respectively, I/O complexity) of and random access queries. With z-fast tries [5, 9] built on the text prefixes for each , we obtain the following:
Lemma 28.
Let be a text and be an order-preserving permutation. Suppose we have access to an oracle supporting fingerprinting queries on in time (respectively, I/O complexity) and extraction of contiguous text characters in time (respectively, I/O complexity). Then, Algorithm 1 runs in time (respectively, I/O complexity), where is the node depth of in the suffix tree of .
Lemma 29.
Algorithm 1 is correct and complete.
Proof (Sketch).
The invariant maintained by the while loop is: if occurs in , then is the occurrence of minimizing .
2.2.2 Locating the secondary occurrences
We now describe how to locate the secondary occurrences. This subsection is devoted to proving the following lemma.
Lemma 30.
Let be a text and be an order-preserving permutation. Let occur in . There exists a data structure that takes words of space and that, given the primary occurrence of , finds all the secondary occurrences in time (equivalently, I/O complexity).
We start by covering with (possibly overlapping) phrases (that is, substrings of ), as follows:
Definition 31 (Phrase cover of ).
-
(Type-1 phrases) we associate phrase (one character) to each position such that .
-
(Type-2 phrases) We associate phrase to each irreducible position such that .
Observe that there are at most type-2 phrases. By definition, our cover of into phrases satisfies the following properties:
Remark 32.
Any pattern occurrence crossing a type-1 phrase (i.e. ) is primary. To see this observe that, due to , we know that is the occurrence of minimizing , hence by the order-preserving property of , is the occurrence of minimizing .
Remark 33.
For each secondary occurrence , there exists a type-2 phrase containing it, i.e. . This immediately follows from the definition of secondary occurrence.
Observe that each type-2 phrase is copied from another text position with a smaller . We formalize this fact as follows:
Definition 34 (Phrase source).
Let be a type-2 phrase. We define to be any position with and .
We also use the fact that each phrase can be split into a prefix containing strictly decreasing values and the remaining suffix. This will play a crucial role in our locating algorithm, as it will allow us to report each secondary occurrence exactly once.
Definition 35 (Reducible prefix).
Let be a type-2 phrase. The reducible prefix of is its longest prefix , with , such that for each .
Remark 36.
All positions in are reducible (that is, not irreducible).
The idea to locate secondary occurrences, is to associate every type-2 phrase with a 2-dimensional rectangle whose coordinates reflect the source of the whole phrase and of its reducible prefix:
Definition 37 (Rectangle associated with a type-2 phrase).
Let be a type-2 phrase, be its source, and be the length of its reducible prefix. We associate with the 2-dimensional rectangle , and label it with position .
Example 38.
In the running example of Figure 2, consider the phrase , let be its source, and be the length of its reducible prefix. This phrase is associated with rectangle .
Our locating algorithm relies on the following well-known data structure result on the orthogonal point enclosure problem:
Lemma 39 (Orthogonal point enclosure, [11, Theorem 6]).
Let be a collection of axis-parallel two-dimensional rectangles in . There exists an -space data structure supporting the following query: given a point , find all rectangles containing , i.e. such that and . The query is answered in time, where is the number of returned rectangles.
Let be the set of rectangles in Definition 37. As noted above, . We build the data structure of Lemma 39 on . The structure uses words of space and answers orthogonal point enclosure queries in time.
Locating algorithm.
Let be the primary occurrence of , found with Algorithm 1. To locate the secondary occurrences, initialize a stack . While is not empty:
-
1.
Pop an element from and report pattern occurrence .
-
2.
Locate all rectangles in containing point . For each retrieved rectangle labeled with position , push in .
Analysis.
Due to space constraints, we defer the detailed analysis to the full version [4]. The time complexity can be derived from the observation that no occurrence is pushed more than once into the stack. Combining this with Lemmas 28, 29, and 30 we obtain:
Theorem 40.
Let be a text and be an order-preserving permutation. Suppose we have access to an oracle supporting fingerprinting queries on in time (respectively, I/O complexity) and the extraction of contiguous characters of in time (respectively, I/O complexity). Then, there exists a data structure taking words of space on top of the oracle and able to report the occurrences of any pattern in time (respectively, I/O complexity), where is the node depth of in the suffix tree of .
2.3 Colexicographic rank (): smaller-space I/O-efficient pattern matching
We now move to the particular case , for which the algorithm described in the previous section can be simplified, leading to a very space-efficient and fast implementation.
Figure 3 depicts the STPD obtained by choosing to be the Inverse Prefix Array. We denote with the path decomposition array associated with this permutation . Similarly, denotes the path decomposition array associated with the dual permutation . The following properties hold:
Lemma 41.
Let be a text. The permutations defined as and for are order-preserving for . Furthermore, and hold.
We now show how to locate the pattern’s occurrences with . In this section, we assume a text oracle supporting the extraction of contiguous text characters with I/O complexity.
2.3.1 Finding the primary occurrence
For the particular order-preserving permutation used in this section, the primary occurrence of is the one for which the text prefix is the colexicographically-smallest being suffixed by .
We use Algorithm 1 to locate the primary occurrence. Since (colexicographic rank) and is sorted colexicographically, observe that is increasing. This means that, in Line 6 of Algorithm 1, it always holds and therefore we do not need a Range Minimum Data structure over .
By implementing by binary search and random access, we obtain:
Lemma 42.
Let be a text, and fix . Suppose we have a text oracle supporting extraction of contiguous characters with I/O complexity. Algorithm 1 requires just array , fitting in words, on top of the text oracle and locates the primary occurrence of with I/O complexity, where is the node depth of in the suffix tree of .
2.3.2 Locating the secondary occurrences
Due to space constraints, here we describe only the outlines of how to locate secondary occurrences. The full description can be found in the full version [4]. Briefly speaking, we can exploit the locating mechanism of the -index [21], with minor modifications. Differently from the toehold lemma of the -index, Algorithm 1 only allows to compute (not ). If we use both and , we can apply repeatedly starting from the primary occurrence for until we reach that for , this will be exactly applications of . On the other hand, we can compute the number occurrences using just . We can find such that by applying recursively and comparing the text with the pattern for every applications. Then, we perform binary search to find . As far as the I/O complexity is concerned, the cost of the first phase is , and that of the second binary search phase is .
2.3.3 Putting everything together
Locating the secondary occurrences of costs I/O complexity and requires words of memory on top of the index at query time. Combining this with Lemma 42, we obtain:
Theorem 43.
Let be a text. Assume we have access to a text oracle supporting the extraction of contiguous characters of with I/O complexity. Our data structure locates all the occurrences of with I/O complexity
and uses memory words on top of the oracle. At query time, further memory words are used.
Observe that the extra memory words of space are negligible; most compressed indexes explicitly store (and/or receive as input) the full pattern at query time anyways, in words. The remaining words of space are spent to store array (at most words) and Nishimoto and Tabei’s data structure [41] storing function (less than words using the optimized implementation of [7]).
2.4 Identity (): leftmost pattern occurrence
Another notable STPD is obtained by using the identity function , trivially satisfying the order-preserving property of Definition 5. We call the corresponding path decomposition array . Similarly, is the path decomposition array associated with the dual permutation .
The size of is equal to the number of irreducible values in the Longest Previous Factor array , a new interesting repetitiveness measure that, to the best of our knowledge, has never been studied before. While we could not prove a theoretical bound for and in term of known repetitiveness measures, below we show that these measures are worst-case optimal, meaning that for every we exhibit a family of strings with requiring words to be stored in the worst case.
Theorem 44.
For any integers and , there exists a family of strings over an alphabet of size such that for every string it holds that and . In particular, no compressor can compress every individual in asymptotically less than bits. The same holds for .
Proof (Sketch).
Consider any integer set . Encode the set as the string . Then . Fix and . Then, the family of such strings contains elements. The proof for is symmetric.
Theorem 44 proves that words of space are essentially worst-case optimal as a function of and to compress the string (the same holds for ). This result is similar to that obtained in [28] for the repetitiveness measure . Since by Theorem 14, bits (in the theorem above, bits) are also sufficient to compress (the same holds for ), this indicates that and are two meaningful repetitiveness measures.
We conclude this section with the following discussion. More detailed explanations can be found in the full version [4].
-
Application to taxonomic classification of DNA fragments. The taxonomic classifiers Kraken [50] and Kraken 2 [49] index the genomes in a given phylogenetic tree such that, given a pattern, they can map each substring of fixed length to the root of the smallest subtree of the phylogenetic tree containing all the genomes containing that substring. A bottleneck is finding the leftmost and rightmost such genomes, which can now be efficiently done using our and .
-
Relation to Ukkonen’s suffix tree construction algorithm. Ukkonen’s algorithm [47] builds the suffix tree by inserting the suffixes from the longest ( to the shortest (). Instead of inserting exactly one suffix (leaf) per iteration like McCreight’s algorithm [36], it inserts a variable number (possibly none) of leaf nodes per iteration. can be interpreted as the number of iterations that insert at least one leaf.
-
Relation with PPM∗. Prediction by Partial Matching with unbounded context (PPM∗) is a popular and effective compression algorithm that encodes each text’s symbol according to the probability distribution of characters following the longest context preceding it that already occurred before in the text followed by . In the simple version of PPM∗ [15], when all previous occurrences of are never followed by , the algorithm outputs a special escape symbol followed by character . Then, is upper-bounded by the number of occurrences of output by this algorithm.
3 Preliminary experimental results
Comparison with other repetitiveness measures.
Table 1 compares the sizes (number of samples) of the three notable suffix tree path decompositions discussed in this paper with existing repetitiveness measures on three repetitive datasets downloaded from https://pizzachili.dcc.uchile.cl/repcorpus.html. Interestingly, on these datasets our new repetitiveness measures are consistently smaller than the smallest suffixient set size () and the number of runs in the Burrows-Wheeler transform of the text () and its reverse ().
| Data | |||||||
|---|---|---|---|---|---|---|---|
| Influenza | 154.808 | 1.815 | 1.805 | 1.928 | 2.225 | 3.022 | 3.018 |
| Cere | 461.286 | 7.455 | 7.455 | 8.954 | 9.921 | 11.574 | 11.575 |
| Escherichia | 112.689 | 9.817 | 9.825 | 11.677 | 13.119 | 15.044 | 15.045 |
Compressed index.
We implemented an optimized prototype of our index (Section 2.3) in C++ to evaluate its performance against the state-of-the-art: the -index [21], move- [7], the suffixient array [10] and the suffix array. We used an ad-hoc implementation of Relative Lempel Ziv [30] for the random access oracle in our index. The evaluation focused on space usage and the efficiency of locating one or all pattern occurrences in repetitive genomic data. See the full version of this paper [4] for the detailed implementation choices and experimental results.
Experiments were conducted on an Intel(R) Xeon(R) W-2245 CPU @ 3.90GHz workstation with 8 cores and 128 gigabytes of RAM running Ubuntu 18.04 LTS 64-bit. The input text consisted of 19 variants of Human chromosome 19 (total length ) downloaded from https://github.com/koeppl/phoni. We extracted patterns of variable length () from random locations in the text. For each pattern, we measured the resources (peak memory and running time) used by all the indexes while finding one pattern occurrence and locating all pattern occurrences.
In our experiments, our st-colex index was always smaller than the -index, about four times smaller than move-, and orders of magnitude smaller than the suffix array. It was moreover always slightly smaller than the suffixient array. Our index was always orders of magnitude faster than the -index on the task of locating one pattern occurrence, and even faster than the suffix array. It was also one order of magnitude faster than move- on long patterns (), and slightly faster on small patterns. As far as locating all pattern occurrences was concerned, we observed similar performance as discussed above for long patterns (), due to the small number of reported occurrences per pattern ( on average on those pattern lengths). On shorter patterns (), the number of reported pattern occurrences was much larger ( on average), and, as expected, our index was slightly slower than move-, slower than the suffix array by an order of magnitude, and slightly faster than the -index.
References
- [1] Omar Ahmed, Massimiliano Rossi, Sam Kovaka, Michael C Schatz, Travis Gagie, Christina Boucher, and Ben Langmead. Pan-genomic matching statistics for targeted nanopore sequencing. iScience, 24(6), 2021.
- [2] Omar Y Ahmed, Massimiliano Rossi, Travis Gagie, Christina Boucher, and Ben Langmead. Spumoni 2: Improved classification using a pangenome index of minimizer digests. Genome Biology, 24(1):122, 2023.
- [3] Ruben Becker, Davide Cenzato, Travis Gagie, Ragnar Groot Koerkamp, Sung-Hwan Kim, Giovanni Manzini, and Nicola Prezza. STPD-index. Software, Funded by the European Union (ERC, REGINDEX, 101039208), swhId: swh:1:dir:d4f76a2be744c622f98d403443e3f4507ae9b536 (visited on 2026-06-19). URL: https://github.com/regindex/STPD-index, doi:10.4230/artifacts.26761.
- [4] Ruben Becker, Davide Cenzato, Travis Gagie, Sung-Hwan Kim, Ragnar Groot Koerkamp, Giovanni Manzini, and Nicola Prezza. Compressing suffix trees by path decompositions. arXiv preprint arXiv.2506.14734, 2025. doi:10.48550/arXiv.2506.14734.
- [5] Djamal Belazzougui, Paolo Boldi, Rasmus Pagh, and Sebastiano Vigna. Monotone minimal perfect hashing: Searching a sorted table with O(1) accesses. In Claire Mathieu, editor, Proceedings of the Twentieth Annual ACM-SIAM Symposium on Discrete Algorithms, SODA 2009, New York, NY, USA, January 4-6, 2009, pages 785–794. SIAM, 2009. doi:10.1137/1.9781611973068.86.
- [6] Djamal Belazzougui, Manuel Cáceres, Travis Gagie, Pawel Gawrychowski, Juha Kärkkäinen, Gonzalo Navarro, Alberto Ordóñez Pereira, Simon J. Puglisi, and Yasuo Tabei. Block trees. J. Comput. Syst. Sci., 117:1–22, 2021. doi:10.1016/j.jcss.2020.11.002.
- [7] Nico Bertram, Johannes Fischer, and Lukas Nalbach. Move-r: Optimizing the r-index. In Leo Liberti, editor, 22nd International Symposium on Experimental Algorithms, SEA 2024, Vienna, Austria, July 23-26, 2024, volume 301 of LIPIcs, pages 1:1–1:19. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2024. doi:10.4230/LIPIcs.SEA.2024.1.
- [8] Philip Bille, Gad M. Landau, Rajeev Raman, Kunihiko Sadakane, Srinivasa Rao Satti, and Oren Weimann. Random access to grammar-compressed strings and trees. SIAM J. Comput., 44(3):513–539, 2015. doi:10.1137/130936889.
- [9] Paolo Boldi and Sebastiano Vigna. Kings, name days, lazy servants and magic. In Hiro Ito, Stefano Leonardi, Linda Pagli, and Giuseppe Prencipe, editors, 9th International Conference on Fun with Algorithms, FUN 2018, La Maddalena, Italy, June 13-15, 2018, volume 100 of LIPIcs, pages 10:1–10:13. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2018. doi:10.4230/LIPIcs.FUN.2018.10.
- [10] Davide Cenzato, Lore Depuydt, Travis Gagie, Sung-Hwan Kim, Giovanni Manzini, Francisco Olivares, and Nicola Prezza. Suffixient arrays: A new efficient suffix array compression technique. arXiv preprint, 2024. arXiv:2407.18753.
- [11] Bernard Chazelle. Filtering search: A new approach to query-answering. SIAM J. Comput., 15(3):703–724, 1986. doi:10.1137/0215051.
- [12] Yu-Feng Chien, Wing-Kai Hon, Rahul Shah, and Jeffrey Scott Vitter. Geometric burrows-wheeler transform: Linking range searching and text indexing. In Data Compression Conference (DCC 2008), pages 252–261, 2008. doi:10.1109/DCC.2008.67.
- [13] Anders Roy Christiansen, Mikko Berggren Ettienne, Tomasz Kociumaka, Gonzalo Navarro, and Nicola Prezza. Optimal-time dictionary-compressed indexes. ACM Trans. Algorithms, 17(1):8:1–8:39, 2021. doi:10.1145/3426473.
- [14] Francisco Claude and Gonzalo Navarro. Improved grammar-based compressed indexes. In Liliana Calderón-Benavides, Cristina N. González-Caro, Edgar Chávez, and Nivio Ziviani, editors, String Processing and Information Retrieval - 19th International Symposium, SPIRE 2012, Cartagena de Indias, Colombia, October 21-25, 2012. Proceedings, volume 7608 of Lecture Notes in Computer Science, pages 180–192. Springer, 2012. doi:10.1007/978-3-642-34109-0_19.
- [15] John G. Cleary and W. J. Teahan. Unbounded length contexts for PPM. Comput. J., 40(2/3):67–75, 1997.
- [16] Davide Cozzi, Massimiliano Rossi, Simone Rubinacci, Travis Gagie, Dominik Köppl, Christina Boucher, and Paola Bonizzoni. - PBWT: a lightweight r-indexing of the PBWT for storing and querying UK biobank data. Bioinform., 39(9), 2023. doi:10.1093/bioinformatics/btad552.
- [17] Vinicius T. V. Date and Leandro M. Zatesko. On the near-tightness of : A general -ary construction and a binary case via LFSRs. arXiv preprint, 2025. arXiv:2512.20598.
- [18] Paolo Ferragina and Giovanni Manzini. Opportunistic data structures with applications. In 41st Annual Symposium on Foundations of Computer Science, FOCS 2000, Redondo Beach, California, USA, November 12-14, 2000, pages 390–398. IEEE Computer Society, 2000. doi:10.1109/SFCS.2000.892127.
- [19] Paolo Ferragina and Rossano Venturini. Compressed cache-oblivious string b-tree. ACM Trans. Algorithms, 12(4), August 2016. doi:10.1145/2903141.
- [20] Travis Gagie, Gonzalo Navarro, and Nicola Prezza. Optimal-time text indexing in BWT-runs bounded space. In Artur Czumaj, editor, Proceedings of the Twenty-Ninth Annual ACM-SIAM Symposium on Discrete Algorithms, SODA 2018, New Orleans, LA, USA, January 7-10, 2018, pages 1459–1477. SIAM, 2018. doi:10.1137/1.9781611975031.96.
- [21] Travis Gagie, Gonzalo Navarro, and Nicola Prezza. Fully functional suffix trees and optimal text searching in BWT-runs bounded space. J. ACM, 67(1):2:1–2:54, 2020. doi:10.1145/3375890.
- [22] Gaston H. Gonnet, Ricardo A. Baeza-Yates, and Tim Snider. New indices for text: Pat trees and pat arrays. In William B. Frakes and Ricardo A. Baeza-Yates, editors, Information Retrieval: Data Structures & Algorithms, pages 66–82. Prentice-Hall, 1992.
- [23] Roberto Grossi and Jeffrey Scott Vitter. Compressed suffix arrays and suffix trees with applications to text indexing and string matching (extended abstract). In F. Frances Yao and Eugene M. Luks, editors, Proceedings of the Thirty-Second Annual ACM Symposium on Theory of Computing, May 21-23, 2000, Portland, OR, USA, pages 397–406. ACM, 2000. doi:10.1145/335305.335351.
- [24] Juha Kärkkäinen, Giovanni Manzini, and Simon J. Puglisi. Permuted longest-common-prefix array. In Gregory Kucherov and Esko Ukkonen, editors, Combinatorial Pattern Matching, 20th Annual Symposium, CPM 2009, Lille, France, June 22-24, 2009, Proceedings, volume 5577 of Lecture Notes in Computer Science, pages 181–192. Springer, 2009. doi:10.1007/978-3-642-02441-2_17.
- [25] Dominik Kempa and Tomasz Kociumaka. Resolution of the Burrows-Wheeler transform conjecture. In Sandy Irani, editor, 61st IEEE Annual Symposium on Foundations of Computer Science, FOCS 2020, Durham, NC, USA, November 16-19, 2020, pages 1002–1013. IEEE, 2020. doi:10.1109/FOCS46700.2020.00097.
- [26] Dominik Kempa and Tomasz Kociumaka. Collapsing the hierarchy of compressed data structures: Suffix arrays in optimal compressed space. In 64th IEEE Annual Symposium on Foundations of Computer Science, FOCS 2023, Santa Cruz, CA, USA, November 6-9, 2023, pages 1877–1886. IEEE, 2023. doi:10.1109/FOCS57990.2023.00114.
- [27] Dominik Kempa and Nicola Prezza. At the roots of dictionary compression: String attractors. In Ilias Diakonikolas, David Kempe, and Monika Henzinger, editors, Proceedings of the 50th Annual ACM SIGACT Symposium on Theory of Computing, STOC 2018, Los Angeles, CA, USA, June 25-29, 2018, pages 827–840. ACM, 2018. doi:10.1145/3188745.3188814.
- [28] Tomasz Kociumaka, Gonzalo Navarro, and Nicola Prezza. Toward a definitive compressibility measure for repetitive sequences. IEEE Trans. Inf. Theory, 69(4):2074–2092, 2023. doi:10.1109/TIT.2022.3224382.
- [29] Sebastian Kreft and Gonzalo Navarro. On compressing and indexing repetitive sequences. Theor. Comput. Sci., 483:115–133, 2013. doi:10.1016/j.tcs.2012.02.006.
- [30] Shanika Kuruppu, Simon J. Puglisi, and Justin Zobel. Relative Lempel-Ziv compression of genomes for large-scale storage and retrieval. In Edgar Chávez and Stefano Lonardi, editors, String Processing and Information Retrieval - 17th International Symposium, SPIRE 2010, Los Cabos, Mexico, October 11-13, 2010. Proceedings, volume 6393 of Lecture Notes in Computer Science, pages 201–206. Springer, 2010. doi:10.1007/978-3-642-16321-0_20.
- [31] Abraham Lempel and Jacob Ziv. On the complexity of finite sequences. IEEE Trans. Inf. Theory, 22(1):75–81, 1976. doi:10.1109/TIT.1976.1055501.
- [32] Veli Mäkinen and Gonzalo Navarro. Succinct suffix arrays based on run-length encoding. Nord. J. Comput., 12(1):40–66, 2005.
- [33] Veli Mäkinen, Gonzalo Navarro, Jouni Sirén, and Niko Välimäki. Storage and retrieval of highly repetitive sequence collections. J. Comput. Biol., 17(3):281–308, 2010. doi:10.1089/cmb.2009.0169.
- [34] Udi Manber and Eugene W. Myers. Suffix arrays: A new method for on-line string searches. SIAM J. Comput., 22(5):935–948, 1993. doi:10.1137/0222058.
- [35] Udi Manber and Gene Myers. Suffix arrays: A new method for on-line string searches. In David S. Johnson, editor, Proceedings of the First Annual ACM-SIAM Symposium on Discrete Algorithms, 22-24 January 1990, San Francisco, California, USA, pages 319–327. SIAM, 1990. URL: http://dl.acm.org/citation.cfm?id=320176.320218.
- [36] Edward M. McCreight. A space-economical suffix tree construction algorithm. J. ACM, 23(2):262–272, 1976. doi:10.1145/321941.321946.
- [37] Gonzalo Navarro. Wavelet trees for all. J. Discrete Algorithms, 25:2–20, 2014. doi:10.1016/j.jda.2013.07.004.
- [38] Gonzalo Navarro. Indexing highly repetitive string collections, part I: Repetitiveness measures. ACM Comput. Surv., 54(2):29:1–29:31, 2022. doi:10.1145/3434399.
- [39] Gonzalo Navarro. Indexing highly repetitive string collections, part II: Compressed indexes. ACM Comput. Surv., 54(2):26:1–26:32, 2022. doi:10.1145/3432999.
- [40] Gonzalo Navarro, Giuseppe Romana, and Cristian Urbina. Smallest suffixient sets as a repetitiveness measure. arXiv preprint arXiv:2506.05638, 2025. doi:10.48550/arXiv.2506.05638.
- [41] Takaaki Nishimoto and Yasuo Tabei. Optimal-time queries on BWT-runs compressed indexes. In Nikhil Bansal, Emanuela Merelli, and James Worrell, editors, 48th International Colloquium on Automata, Languages, and Programming, ICALP 2021, Glasgow, Scotland (Virtual Conference), July 12-16, 2021, volume 198 of LIPIcs, pages 101:1–101:15. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2021. doi:10.4230/LIPIcs.ICALP.2021.101.
- [42] Nicola Prezza. Optimal substring equality queries with applications to sparse text indexing. ACM Trans. Algorithms, 17(1):7:1–7:23, 2021. doi:10.1145/3426870.
- [43] Simon J. Puglisi and Bella Zhukova. Relative Lempel-Ziv compression of suffix arrays. In Christina Boucher and Sharma V. Thankachan, editors, String Processing and Information Retrieval - 27th International Symposium, SPIRE 2020, Orlando, FL, USA, October 13-15, 2020, Proceedings, volume 12303 of Lecture Notes in Computer Science, pages 89–96. Springer, 2020. doi:10.1007/978-3-030-59212-7_7.
- [44] Massimiliano Rossi, Marco Oliva, Paola Bonizzoni, Ben Langmead, Travis Gagie, and Christina Boucher. Finding maximal exact matches using the r-index. J. Comput. Biol., 29(2):188–194, 2022. doi:10.1089/cmb.2021.0445.
- [45] Massimiliano Rossi, Marco Oliva, Ben Langmead, Travis Gagie, and Christina Boucher. MONI: A pangenomic index for finding maximal exact matches. J. Comput. Biol., 29(2):169–187, 2022. doi:10.1089/cmb.2021.0290.
- [46] Vikram Shivakumar, Omar Y. Ahmed, Sam Kovaka, Mohsen Zakeri, and Ben Langmead. Sigmoni: Classification of nanopore signal with a compressed pangenome index. Bioinform., 40(Supplement_1):i287–i296, 2024. doi:10.1093/bioinformatics/btae213.
- [47] Esko Ukkonen. On-line construction of suffix trees. Algorithmica, 14(3):249–260, 1995. doi:10.1007/BF01206331.
- [48] Peter Weiner. Linear pattern matching algorithms. In 14th Annual Symposium on Switching and Automata Theory, Iowa City, Iowa, USA, October 15-17, 1973, pages 1–11. IEEE Computer Society, 1973. doi:10.1109/SWAT.1973.13.
- [49] Derrick E Wood, Jennifer Lu, and Ben Langmead. Improved metagenomic analysis with Kraken 2. Genome Biology, 20:1–13, 2019.
- [50] Derrick E Wood and Steven L Salzberg. Kraken: ultrafast metagenomic sequence classification using exact alignments. Genome Biology, 15:1–12, 2014.
- [51] Mohsen Zakeri, Nathaniel K Brown, Omar Y Ahmed, Travis Gagie, and Ben Langmead. Movi: a fast and cache-efficient full-text pangenome index. iScience, 27(12), 2024.
