The Jump Index

FM-index et al.: LF cache-miss per character :( Link to heading

I/O-efficient pattern matching using suffix tries Link to heading

  • Suffix trees are in text space and I/O efficient!
  • Suffix trees of repetitive texts are repetitive!
  • “run-length suffix trees” embedded in the text:

    • Suffixient Sets: Depuydt et al. (2023)
    • Suffixient Array: Cenzato et al. (2024)
    • Suffix Tree Path Decomposition: Becker et al. (2026)
  • Greedily match pattern against text.

    • “Reposition” on mismatch by searching sparse prefix array.

Jump Index:

  • For every possible mismatch (switch between paths):
    • store link/pointer (source_pos, char, depth) ↦ target
    • Eg: (3, $, 2) ↦ 11:
      • Prefix AA of pattern AA$ matches at pos 2.
      • Mismatch as pos 3: got C, want $.
      • We find the $ at pos 11.

Jump Index Link to heading

  • Full example:

    • (source, char, depth) ↦ target
    • (1, $, 0) ↦ 11
    • (1, C, 0) ↦ 3
    • (1, G, 0) ↦ 4
    • (2, $, 1) ↦ 11
    • (2, C, 1) ↦ 3
    • (3, $, 2) ↦ 11
    • (5, A, 1) ↦ 9
    • (5, A, 2) ↦ 9
    • (7, A, 3) ↦ 9
    • (7, A, 4) ↦ 9
  • Store using Elias-Fano or HashMap.
  • With similar pointers for suffix links, we get match statistics!
  • Incremental/online construction similar to Ukkonen’s algorithm.
  • Locates only the leftmost occurrence of each substring
    • Does not support locate-all!
(in M)ncopiesrCDAWG-nCDAWG-etype\(\vert\mathsf{stpd}\vert\)#(src)#(src,c)#(links)
influenza154.8178k3.027.7317.15pos-1.931.822.342.94
lex-1.821.582.092.98
dna.001.1104.861001.726.0012.91pos-1.250.761.271.61
lex-1.100.791.291.71
einstein.de.txt92.762.1k0.100.080.23pos-0.060.040.090.10
lex-0.060.040.090.10
Escherichia_Coli112.692315.0412.0131.33pos-11.687.0711.8814.97
lex-9.826.8411.5314.99

Goal: match statistics on HPRCv2 in 50GB RAM Link to heading