├── netlify.toml ├── src ├── env.d.ts ├── components │ ├── Hero.astro │ ├── GraphPage.astro │ ├── TableOfContents.astro │ ├── PageFrame.astro │ ├── Publications.astro │ ├── LinkPreview.astro │ ├── Timeline.astro │ ├── publications.ts │ ├── Graphviz.astro │ ├── RecentChanges.astro │ ├── svgpanzoom.ts │ ├── Tags.astro │ ├── TagList.astro │ ├── Alphabetical.astro │ ├── Backlinks.astro │ ├── Graph.astro │ ├── timeline.ts │ ├── preview.ts │ └── graphRenderer.ts ├── content │ ├── docs │ │ ├── tags.mdx │ │ ├── graph.mdx │ │ ├── recent.mdx │ │ ├── alphabetical.mdx │ │ ├── algorithms │ │ │ ├── Automata │ │ │ │ ├── Forward-DAWG-Matching.md │ │ │ │ ├── Backward-DAWG-Matching.md │ │ │ │ ├── Succint Backward DAWG Matching.md │ │ │ │ ├── Reverse-Factor.md │ │ │ │ ├── BSDMqx using multiple windows.md │ │ │ │ ├── Turbo-Reverse-Factor.md │ │ │ │ ├── Linear DAWG Matching.md │ │ │ │ ├── Wide Window.md │ │ │ │ ├── Deterministic-Finite-Automaton.md │ │ │ │ ├── Improved Linear DAWG Matching.md │ │ │ │ ├── Improved Linear DAWG Matching 2.md │ │ │ │ ├── Simplified Forward Backward Oracle Matching.md │ │ │ │ ├── Simplified Extended Backward Oracle Matching.md │ │ │ │ ├── Simon.md │ │ │ │ ├── BSDM using q-grams and shift-xor.md │ │ │ │ ├── Backward SNR DAWG Matching.md │ │ │ │ ├── Backward-Oracle-Matching.md │ │ │ │ ├── index.md │ │ │ │ ├── Double Forward DAWG Matching.md │ │ │ │ ├── Extended Backward Oracle Matching.md │ │ │ │ └── Forward Backward Oracle Matching.md │ │ │ ├── Comparison of Characters │ │ │ │ ├── Knuth-Morris-Prat.md │ │ │ │ ├── Horspool.md │ │ │ │ ├── Colussi.md │ │ │ │ ├── Brute-Force.md │ │ │ │ ├── Not-So-Naive.md │ │ │ │ ├── Zhu-Takaoka.md │ │ │ │ ├── Enhanced RS-A.md │ │ │ │ ├── Quick-Search.md │ │ │ │ ├── Galil-Giancarlo.md │ │ │ │ ├── Reverse-Colussi.md │ │ │ │ ├── Enhanced ERS-A.md │ │ │ │ ├── Four Sliding Windows.md │ │ │ │ ├── Enhanced Two Sliding Windows.md │ │ │ │ ├── Simple String Matching.md │ │ │ │ ├── Smith.md │ │ │ │ ├── Maximal-Shift.md │ │ │ │ ├── Apostolico-Crochemore.md │ │ │ │ ├── Apostolico-Giancarlo.md │ │ │ │ ├── Enhanced Berry-Ravindran.md │ │ │ │ ├── Morris-Pratt.md │ │ │ │ ├── Karp-Rabin.md │ │ │ │ ├── Optimal-Mismatch.md │ │ │ │ ├── String-Matching on Ordered Alphabet.md │ │ │ │ ├── Max Shift Horspool.md │ │ │ │ ├── Sheik-Sumit-Anindya-Balakrishnan-Sekar.md │ │ │ │ ├── Boyer-Moore-Horspool using Probabilities.md │ │ │ │ ├── Max Shift Boyer-Moore.md │ │ │ │ ├── 2-Block Boyer-Moore.md │ │ │ │ ├── Raita.md │ │ │ │ ├── Wu-Manber for Single Pattern Matching.md │ │ │ │ ├── Boyer-Moore.md │ │ │ │ ├── Tailed-Substring.md │ │ │ │ ├── Alpha-Skip-Search.md │ │ │ │ ├── Backward-Fast-Search.md │ │ │ │ ├── Knuth-Morris-Pratt Skip-Search.md │ │ │ │ ├── Skip-Search.md │ │ │ │ ├── Two-Way.md │ │ │ │ ├── Ahmed-Kaykobad-Chowdhury.md │ │ │ │ ├── Forward-Fast-Search.md │ │ │ │ ├── Genomic Rapid Algo for String Pm.md │ │ │ │ ├── Two Sliding Windows.md │ │ │ │ ├── Tuned-Boyer-Moore.md │ │ │ │ ├── Skip-Search using q-grams.md │ │ │ │ ├── Thathoo-Virmani-Sai-Balakrishnan-Sekar.md │ │ │ │ ├── Hashq using Multiple Hashing Functions.md │ │ │ │ ├── Fast-Search using Multiple Windows.md │ │ │ │ ├── TVSBS using Multiple Windows.md │ │ │ │ ├── Berry-Ravindran.md │ │ │ │ ├── Bounded Boyer-Moore.md │ │ │ │ ├── Bounded Fast-Search.md │ │ │ │ ├── Galil-Seiferas.md │ │ │ │ ├── Bounded Forward-Fast-Search.md │ │ │ │ ├── Turbo-Boyer-Moore.md │ │ │ │ ├── Boyer-Moore-Horspool with q-grams.md │ │ │ │ ├── Quantum Leap Quick-Search.md │ │ │ │ ├── Franek-Jennings-Smyth.md │ │ │ │ ├── Improved Occurrence Heuristics.md │ │ │ │ ├── Worst Occurrence Heuristics.md │ │ │ │ ├── Fast-Search.md │ │ │ │ ├── Jumping Occurrence Heuristics.md │ │ │ │ └── index.md │ │ │ ├── Bit Parallelism │ │ │ │ ├── Bit parallel Wide Window.md │ │ │ │ ├── Backward-Nondeterministic-DAWG-Matching.md │ │ │ │ ├── BNDM for Long patterns.md │ │ │ │ ├── Horspool with BNDM test.md │ │ │ │ ├── BNDM with Horspool Shift.md │ │ │ │ ├── Simplified BNDM with loop-unrolling.md │ │ │ │ ├── BNDM with loop-unrolling.md │ │ │ │ ├── FNDM with q-grams.md │ │ │ │ ├── Forward Nondeterministic DAWG Matching.md │ │ │ │ ├── BNDM with q-grams.md │ │ │ │ ├── Simplified BNDM with q-grams.md │ │ │ │ ├── Fast Average Optimal Shift-Or.md │ │ │ │ ├── SBNDM using Multiple Windows.md │ │ │ │ ├── Bit-Parallel2 Wide-Window.md │ │ │ │ ├── Forward SBNDM using Multiple Windows.md │ │ │ │ ├── Bit-Parallel Wide-Window2.md │ │ │ │ ├── Q-Gram Filtering.md │ │ │ │ ├── Bit-Parallel Length Invariant Matcher.md │ │ │ │ ├── Shift Vector Matching.md │ │ │ │ ├── Average Optimal Shift-Or.md │ │ │ │ ├── Improved Two-Way Shift-Or.md │ │ │ │ ├── Improved Two-Way Shift-And.md │ │ │ │ ├── Small Alphabet Bit-Parallel.md │ │ │ │ ├── BNDMq Long.md │ │ │ │ ├── Shift-And.md │ │ │ │ ├── Shift-Or.md │ │ │ │ ├── index.md │ │ │ │ ├── Two-Way Nondeterministic DAWG Matching.md │ │ │ │ ├── Long patterns BNDM.md │ │ │ │ ├── Two-Way Shift-Or using q-grams.md │ │ │ │ ├── Simplified BNDM.md │ │ │ │ ├── Two-Way Shift-And using q-grams.md │ │ │ │ ├── BNDM with Extended Shifts.md │ │ │ │ ├── Forward Simplified BNDM.md │ │ │ │ ├── Forward BNDM.md │ │ │ │ ├── Forward SBNDM using q-grams and Lookahead.md │ │ │ │ ├── Factorized BNDM.md │ │ │ │ └── Factorized Shift-And.md │ │ │ └── Packed String Matching │ │ │ │ ├── index.md │ │ │ │ ├── Super Alphabet Simulation.md │ │ │ │ ├── Packed Belazzougui-Raffinot.md │ │ │ │ ├── Packed String Search.md │ │ │ │ ├── Streaming SIMD Extensions Filter.md │ │ │ │ ├── Exact Packed String Matching.md │ │ │ │ ├── Packed Belazzougui.md │ │ │ │ └── Crochemore-Perrin algorithm using SSE instructions.md │ │ └── index.mdx │ └── config.ts ├── pages │ └── timeline.svg.ts ├── lib │ ├── graph.ts │ └── braindb.mjs └── styles │ └── custom.css ├── tsconfig.json ├── .vscode ├── extensions.json └── launch.json ├── .gitignore ├── plugins └── remark-modified-time.mjs ├── public └── favicon.svg ├── package.json ├── README.md ├── astro.config.mjs └── references.txt /netlify.toml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "astro/tsconfigs/strict", 3 | "exclude": [ 4 | "dist" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["astro-build.astro-vscode"], 3 | "unwantedRecommendations": [] 4 | } 5 | -------------------------------------------------------------------------------- /src/components/Hero.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Publications from "./Publications.astro"; 3 | --- 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/components/GraphPage.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Graph from "./Graph.astro"; 3 | import { getGraph } from "../lib/graph"; 4 | const graph = await getGraph(); 5 | --- 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/content/docs/tags.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tags 3 | tableOfContents: false 4 | prev: false 5 | next: false 6 | --- 7 | import TagList from "../../components/TagList.astro"; 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/content/docs/graph.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Graph 3 | tableOfContents: false 4 | prev: false 5 | next: false 6 | --- 7 | 8 | import GraphPage from "../../components/GraphPage.astro"; 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/content/docs/recent.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Recently changed 3 | tableOfContents: false 4 | prev: false 5 | next: false 6 | --- 7 | import RecentChanges from "../../components/RecentChanges.astro"; 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/content/docs/alphabetical.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Alphabetical index 3 | tableOfContents: false 4 | prev: false 5 | next: false 6 | --- 7 | import Alphabetical from "../../components/Alphabetical.astro"; 8 | 9 | 10 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "command": "./node_modules/.bin/astro dev", 6 | "name": "Development server", 7 | "request": "launch", 8 | "type": "node-terminal" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | # generated types 4 | .astro/ 5 | 6 | # dependencies 7 | node_modules/ 8 | 9 | # logs 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | pnpm-debug.log* 14 | 15 | 16 | # environment variables 17 | .env 18 | .env.production 19 | 20 | # macOS-specific files 21 | .DS_Store 22 | 23 | .braindb 24 | -------------------------------------------------------------------------------- /plugins/remark-modified-time.mjs: -------------------------------------------------------------------------------- 1 | import { execSync } from "child_process"; 2 | 3 | export function remarkModifiedTime() { 4 | return function (_tree, file) { 5 | const filepath = file.history[0]; 6 | const result = execSync(`git log -1 --pretty="format:%cI" "${filepath}"`); 7 | file.data.astro.frontmatter.lastUpdated = result.toString(); 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /src/components/TableOfContents.astro: -------------------------------------------------------------------------------- 1 | --- 2 | // https://github.com/withastro/starlight/blob/main/packages/starlight/components/TableOfContents.astro 3 | import type { Props } from "@astrojs/starlight/props"; 4 | import Default from "@astrojs/starlight/components/TableOfContents.astro"; 5 | import Backlinks from "./Backlinks.astro"; 6 | --- 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/content/config.ts: -------------------------------------------------------------------------------- 1 | import { z, defineCollection } from "astro:content"; 2 | import { docsSchema, i18nSchema } from "@astrojs/starlight/schema"; 3 | 4 | export const collections = { 5 | docs: defineCollection({ 6 | schema: docsSchema({ 7 | extend: z.object({ 8 | tags: z.array(z.string()).optional(), 9 | }), 10 | }), 11 | }), 12 | i18n: defineCollection({ type: "data", schema: i18nSchema() }), 13 | }; 14 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Forward-DAWG-Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Forward-DAWG-Matching 3 | date: 1994 4 | abbreviation: FDM 5 | sidebar: 6 | order: 65 7 | tags: 8 | - automata 9 | --- 10 | 11 | It is a linear algorithm using the suffix automaton of the pattern 12 | 13 | Appeared in: 14 | 15 | - [35]: Crochemore, M., Rytter, W.: Text Algorithms. Oxford University Press (1994), http://www-igm.univ-mlv.fr/~mac/REC/B1.html 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Backward-DAWG-Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Backward-DAWG-Matching 3 | date: 1994 4 | abbreviation: BDM 5 | sidebar: 6 | order: 66 7 | tags: 8 | - automata 9 | --- 10 | 11 | Variant of [[Reverse-Factor]]. It uses the Directed Acyclic Word Graph of the pattern 12 | 13 | Appeared in: 14 | 15 | - [35]: Crochemore, M., Rytter, W.: Text Algorithms. Oxford University Press (1994), http://www-igm.univ-mlv.fr/~mac/REC/B1.html 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Knuth-Morris-Prat.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Knuth-Morris-Prat 3 | date: 1977 4 | abbreviation: KMP 5 | sidebar: 6 | order: 3 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Linear algorithm. Improvement of [[Morris-Pratt]]. 12 | 13 | Appeared in: 14 | 15 | - [74]: Knuth, D.E., Jr., J.H.M., Pratt, V.R.: Fast pattern matching in strings. SIAM J. Comput. 6(2), 323–350 (1977), http://dx.doi.org/10.1137/0206024 16 | -------------------------------------------------------------------------------- /src/components/PageFrame.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import type { Props } from "@astrojs/starlight/props"; 3 | import Default from "@astrojs/starlight/components/PageFrame.astro"; 4 | import LinkPreview from "./LinkPreview.astro"; 5 | --- 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 18 | -------------------------------------------------------------------------------- /src/pages/timeline.svg.ts: -------------------------------------------------------------------------------- 1 | import { publications } from "../components/publications"; 2 | import { dotTimeline } from "../components/timeline"; 3 | import { Graphviz as GraphvizWasm } from "@hpcc-js/wasm/graphviz"; 4 | const graphviz = await GraphvizWasm.load(); 5 | 6 | export async function GET({}) { 7 | let svg = graphviz.dot(dotTimeline({ items: await publications() })); 8 | return new Response(svg, { 9 | headers: { "Content-Type": "image/svg+xml" }, 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Horspool.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Horspool 3 | date: 1980 4 | abbreviation: HOR 5 | sidebar: 6 | order: 5 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Boyer-Moore]]. It uses only a modification if the occurrence heuristics. 12 | 13 | Appeared in: 14 | 15 | - [65]: Horspool, R.N.: Practical fast searching in strings. Softw., Pract. Exper. 10(6), 501–506 (1980), http://dx.doi.org/10.1002/spe.4380100608 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Colussi.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Colussi 3 | date: 1991 4 | abbreviation: COL 5 | sidebar: 6 | order: 16 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Refinement of [[Knuth-Morris-Prat]] using a 2-factorization of the pattern 12 | 13 | Appeared in: 14 | 15 | - [29]: Colussi, L.: Correctness and efficiency of the pattern matching algorithms. Inf. Comput. 95(2), 225–251 (1991), http://dx.doi.org/10.1016/0890-5401(91)90046-5 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Brute-Force.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Brute-Force 3 | date: 0 4 | abbreviation: BF 5 | sidebar: 6 | order: 1 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Naive algorithm for the string matching problem. It works in $O(nm)$-time 12 | 13 | Appeared in: 14 | 15 | - [31]: Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C.: Introduction to Algorithms (3. ed.). MIT Press (2009), http://mitpress.mit.edu/books/introduction-algorithms 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Not-So-Naive.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Not-So-Naive 3 | date: 1993 4 | abbreviation: NSN 5 | sidebar: 6 | order: 22 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Brute-Force]]. It uses constant extra space and works in $O(nm)$-time. 12 | 13 | Appeared in: 14 | 15 | - [62]: Hancart, C.: Analyse exacte et en moyenne d’algorithmes de recherche d’un motif dans un texte. Th`ese de doctorat, Universit´e Paris 7 (1993) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Zhu-Takaoka.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Zhu-Takaoka 3 | date: 1987 4 | abbreviation: ZT 5 | sidebar: 6 | order: 9 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Horspool]] which uses two characters for computing the occurrence heuristics. 12 | 13 | Appeared in: 14 | 15 | - [101]: Zhu, R.F., Takaoka, T.: On improving the average case of the Boyer-Moore string matching algorithm. J. Inform. Process. 10(3), 173–177 (1987) 16 | -------------------------------------------------------------------------------- /src/components/Publications.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Timeline from "./Timeline.astro"; 3 | import { publications } from "./publications"; 4 | 5 | interface Props { 6 | fullWidth?: boolean; 7 | } 8 | 9 | const { fullWidth } = Astro.props; 10 | 11 | const items = await publications(); 12 | --- 13 | 14 |
15 | 16 |
17 | 18 | 23 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Bit parallel Wide Window.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bit parallel Wide Window 3 | date: 2005 4 | abbreviation: BWW 5 | sidebar: 6 | order: 94 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Simulates the nondeterministic version of the automaton in [[Wide Window]] 12 | 13 | Appeared in: 14 | 15 | - [63]: He, L., Fang, B., Sui, J.: The wide window string matching algorithm. Theor. Comput. Sci. 332(1-3), 391–404 (2005), http://dx.doi.org/10.1016/j.tcs.2004.12.002 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Enhanced RS-A.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Enhanced RS-A 3 | date: 2013 4 | abbreviation: ERSA 5 | sidebar: 6 | order: 52 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Enhanced Berry-Ravindran]] and [[Two Sliding Windows]]. 12 | 13 | Appeared in: 14 | 15 | - [94]: Suleiman, D., Hudaib, A., Al-Anani, A., R., A.K., Itriq, M.: Ers-a algorithm for pattern matching. Middle East Journal of Scientific Research 15, 1067–1075 (2013) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Quick-Search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Quick-Search 3 | date: 1990 4 | abbreviation: QS 5 | sidebar: 6 | order: 10 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Horspool]]. It uses the character which follows the current window to compute the occurrence heuristics. 12 | 13 | Appeared in: 14 | 15 | - [96]: Sunday, D.: A very fast substring search algorithm. Commun. ACM 33(8), 132–142 (1990), http://doi.acm.org/10.1145/79173.79184 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Galil-Giancarlo.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Galil-Giancarlo 3 | date: 1992 4 | abbreviation: GG 5 | sidebar: 6 | order: 18 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Refinement of [[Colussi]] which performs at most $4n/3$ inspections in the worst case. 12 | 13 | Appeared in: 14 | 15 | - [59]: Galil, Z., Giancarlo, R.: On the exact complexity of string matching: Upper bounds. SIAM J. Comput. 21(3), 407–437 (1992), http://dx.doi.org/10.1137/0221028 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Succint Backward DAWG Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Succint Backward DAWG Matching 3 | date: 2008 4 | abbreviation: SBDM 5 | sidebar: 6 | order: 75 7 | tags: 8 | - automata 9 | --- 10 | 11 | Variant of [[Backward-DAWG-Matching]]. It is based on the combination of compressed self-indexes and BDM 12 | 13 | Appeared in: 14 | 15 | - [57]: Fredriksson, K.: Succinct backward-dawg-matching. ACM Journal of Experimental Algorithmics 13 (2008), http://doi.acm.org/10.1145/1412228.1455263 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Reverse-Colussi.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Reverse-Colussi 3 | date: 1994 4 | abbreviation: RCOL 5 | sidebar: 6 | order: 23 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Colussi]] and [[Boyer-Moore]]. It works in linear time and performs at most $2n$ character inspections. 12 | 13 | Appeared in: 14 | 15 | - [30]: Colussi, L.: Fastest pattern matching in strings. J. Algorithms 16(2), 163–189 (1994), http://dx.doi.org/10.1006/jagm.1994.1008 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Enhanced ERS-A.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Enhanced ERS-A 3 | date: 2015 4 | abbreviation: EERSA 5 | sidebar: 6 | order: 58 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Enhanced RS-A]] and [[Enhanced Two Sliding Windows]]. 12 | 13 | Appeared in: 14 | 15 | - [95]: Suleiman, D., Itriq, M., Al-Anani, A., Al-Khalid, R., Hudaib, A.: Enhancing ersa algorithm for pattern matching (eers-a). Journal of Software Engineering and Applications 8, 143–153 (2015) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Four Sliding Windows.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Four Sliding Windows 3 | date: 2015 4 | abbreviation: FSW 5 | sidebar: 6 | order: 59 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Enhanced RS-A]] using four sliding windows. 12 | 13 | Appeared in: 14 | 15 | - [68]: Hudaib, A., Al-Khalid, R., Al-Anani, A., Itriq, M., Suleiman, D.: Four sliding windows pattern matching algorithm (fsw). Journal of Software Engineering and Applications 8, 154–165 (2015) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Enhanced Two Sliding Windows.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Enhanced Two Sliding Windows 3 | date: 2012 4 | abbreviation: ETSW 5 | sidebar: 6 | order: 49 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Two Sliding Windows]] and [[Berry-Ravindran]]. 12 | 13 | Appeared in: 14 | 15 | - [71]: Itriq, M., Hudaib, A., Al-Anani, A., Al-Khalid, R., Suleiman, D.: Enhanced two sliding windows algorithm for pattern matching (etsw). Journal of American Science 8, 60–616 (2012) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Simple String Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Simple String Matching 3 | date: 2015 4 | abbreviation: SSM 5 | sidebar: 6 | order: 56 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Modification of [[Horspool]]. It scans the text from left to right and matches the pattern from right to left. 12 | 13 | Appeared in: 14 | 15 | - [2]: Al-Ssulami, A.M.: Hybrid string matching algorithm with a pivot. J. Information Science 41(1), 82–88 (2015), http://dx.doi.org/10.1177/0165551514555668 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Smith.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Smith 3 | date: 1991 4 | abbreviation: SMITH 5 | sidebar: 6 | order: 17 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Horspool]] and [[Quick-Search]] which takes the maximum of the shifts proposed by the two occurrences heuristics. 12 | 13 | Appeared in: 14 | 15 | - [93]: Smith, P.D.: Experiments with a very fast substring search algorithm. Softw., Pract. Exper. 21(10), 1065–1074 (1991), http://dx.doi.org/10.1002/spe.4380211006 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Reverse-Factor.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Reverse-Factor 3 | date: 1992 4 | abbreviation: RF 5 | sidebar: 6 | order: 62 7 | tags: 8 | - automata 9 | --- 10 | 11 | Combination of [[Deterministic-Finite-Automaton]] and [[Boyer-Moore]]. It uses the suffix automaton of the reverse of the pattern. It works in $O(nm)$ worst case time. 12 | 13 | Appeared in: 14 | 15 | - [77]: Lecroq, T.: A variation on the boyer-moore algorithm. Theor. Comput. Sci. 92(1), 119–144 (1992), http://dx.doi.org/10.1016/0304-3975(92)90139-7 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Maximal-Shift.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Maximal-Shift 3 | date: 1990 4 | abbreviation: MS 5 | sidebar: 6 | order: 12 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Variation of [[Quick-Search]] where pattern characters are scanned from the one which will lead to a larger shift to the one which will lead to a shorter shift 12 | 13 | Appeared in: 14 | 15 | - [96]: Sunday, D.: A very fast substring search algorithm. Commun. ACM 33(8), 132–142 (1990), http://doi.acm.org/10.1145/79173.79184 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Apostolico-Crochemore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Apostolico-Crochemore 3 | date: 1991 4 | abbreviation: AC 5 | sidebar: 6 | order: 13 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Modification of [[Knuth-Morris-Prat]]. It performs at most $3n/2$ characters inspections in the worst case. 12 | 13 | Appeared in: 14 | 15 | - [6]: Apostolico, A., Crochemore, M.: Optimal canonization of all substrings of a string. Inf. Comput. 95(1), 76–95 (1991), http://dx.doi.org/10.1016/0890-5401(91)90016-U 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Apostolico-Giancarlo.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Apostolico-Giancarlo 3 | date: 1986 4 | abbreviation: AG 5 | sidebar: 6 | order: 7 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Variant of [[Boyer-Moore]]. It works in $O(n)$-time complexity and performs $3n/2$ comparisons in the worst case. 12 | 13 | Appeared in: 14 | 15 | - [7]: Apostolico, A., Giancarlo, R.: The boyer-moore-galil string searching strategies revisited. SIAM J. Comput. 15(1), 98–105 (1986), http://dx.doi.org/10.1137/0215007 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Enhanced Berry-Ravindran.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Enhanced Berry-Ravindran 3 | date: 2012 4 | abbreviation: RSA 5 | sidebar: 6 | order: 51 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Variant of [[Berry-Ravindran]] using four characters to compute the occurrence heuristics 12 | 13 | Appeared in: 14 | 15 | - [90]: Senapati, K., Mal, S., Sahoo, G.: Rs-a fast pattern matching algorithm for biological sequences. International Journal of Engineering and Innovative Technology 1, 116–118 (2012) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Morris-Pratt.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Morris-Pratt 3 | date: 1970 4 | abbreviation: MP 5 | sidebar: 6 | order: 2 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | First linear algorithm scanning the text and the pattern from left to right. 12 | It derives from [[Brute-Force]]. Preprocessing of the pattern in $O(m)$-time and -space. 13 | 14 | Appeared in: 15 | 16 | - [80]: Morris, Jr, J.H., Pratt, V.R.: A linear pattern-matching algorithm. Report 40, University of California, Berkeley (1970) 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Karp-Rabin.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Karp-Rabin 3 | date: 1987 4 | abbreviation: KR 5 | sidebar: 6 | order: 8 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | First filter algorithm using an hashing function. It works in $O(mn)$-time complexity but has an $O(n + m)$ expected running time. 12 | 13 | Appeared in: 14 | 15 | - [73]: Karp, R.M., Rabin, M.O.: Efficient randomized pattern-matching algorithms. IBM Journal of Research and Development 31(2), 249–260 (1987), http://dx.doi.org/10.1147/rd.312.0249 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Optimal-Mismatch.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Optimal-Mismatch 3 | date: 1990 4 | abbreviation: OM 5 | sidebar: 6 | order: 11 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Variation of [[Quick-Search]] using probabilities of characters. It compares the pattern and the text proceeding from the less frequent to the more frequent character. 12 | 13 | Appeared in: 14 | 15 | - [96]: Sunday, D.: A very fast substring search algorithm. Commun. ACM 33(8), 132–142 (1990), http://doi.acm.org/10.1145/79173.79184 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/String-Matching on Ordered Alphabet.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: String-Matching on Ordered ALphabet 3 | date: 1992 4 | abbreviation: SMOA 5 | sidebar: 6 | order: 20 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | It uses constant extra space and achieves a linear time complexity. It inspects at most $6n + 5$ characters. 12 | 13 | Appeared in: 14 | 15 | - [32]: Crochemore, M.: String-matching on ordered alphabets. Theor. Comput. Sci. 92(1), 33–47 (1992), http://dx.doi.org/10.1016/0304-3975(92)90134-2 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Backward-Nondeterministic-DAWG-Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Backward-Nondeterministic-DAWG-Matching 3 | date: 1998 4 | abbreviation: BNDM 5 | sidebar: 6 | order: 83 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Simulates the nondeterministic version of the automaton in [[Backward-DAWG-Matching]]. 12 | 13 | Appeared in: 14 | 15 | - [82]: Navarro, G., Raffinot, M.: A bit-parallel approach to suffix automata: Fast extended string matching. In: Farach-Colton [41], pp. 14–33, http://dx.doi.org/10.1007/BFb003077822 Simone Faro 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Max Shift Horspool.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Max Shift Horspool 3 | date: 2012 4 | abbreviation: MSH 5 | sidebar: 6 | order: 48 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Horspool]] and [[Boyer-Moore]]. It takes the maximum shift proposed by the two occurrence heuristics. 12 | 13 | Appeared in: 14 | 15 | - [89]: Sahli, M., Shibuya, T.: Max-shift BM and max-shift horspool: Practical fast exact string matching algorithms. JIP 20(2), 419–425 (2012), http://dx.doi.org/10.2197/ipsjjip.20.419 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Sheik-Sumit-Anindya-Balakrishnan-Sekar.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Sheik-Sumit-Anindya-Balakrishnan-Sekar 3 | date: 2004 4 | abbreviation: SSABS 5 | sidebar: 6 | order: 33 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Quick-Search]] and [[Raita]] 12 | 13 | Appeared in: 14 | 15 | - [91]: Sheik, S.S., Aggarwal, S.K., Poddar, A., Balakrishnan, N., Sekar, K.: A FAST pattern matching algorithm. Journal of Chemical Information and Modeling 44(4), 1251–1256 (2004), http://dx.doi.org/10.1021/ci030463z 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/BSDMqx using multiple windows.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: BSDMqx using multiple windows 3 | date: 2016 4 | abbreviation: BSDMqxw 5 | sidebar: 6 | order: 80 7 | tags: 8 | - automata 9 | --- 10 | 11 | Improvement of [[BSDM using q-grams and shift-xor]] which uses multiple sliding windows. 12 | 13 | Appeared in: 14 | 15 | - [42]: Faro, S.: Evaluation and improvement of fast algorithms for exact matching on genome sequences. In: 3rd Internanional Conference on Algorithms for Computational Biology. Lecture Notes in Computer Science, Springer (2016) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Boyer-Moore-Horspool using Probabilities.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Boyer-Moore-Horspool using Probabilities 3 | date: 2006 4 | abbreviation: PBMH 5 | sidebar: 6 | order: 35 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Optimal-Mismatch]] and [[Horspool]]. 12 | 13 | Appeared in: 14 | 15 | - [84]: Nebel, M.E.: Fast string matching by using probabilities: On an optimal mismatch variant of horspool’s algorithm. Theor. Comput. Sci. 359(1-3), 329–343 (2006), http://dx.doi.org/10.1016/j.tcs.2006.05.028 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Max Shift Boyer-Moore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Max Shift Boyer-Moore 3 | date: 2012 4 | abbreviation: MSBM 5 | sidebar: 6 | order: 47 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Boyer-Moore]] and [[Horspool]]. It takes the maximum shift proposed by the two occurrence heuristics. 12 | 13 | Appeared in: 14 | 15 | - [89]: Sahli, M., Shibuya, T.: Max-shift BM and max-shift horspool: Practical fast exact string matching algorithms. JIP 20(2), 419–425 (2012), http://dx.doi.org/10.2197/ipsjjip.20.419 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/2-Block Boyer-Moore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 2-Block Boyer-Moore 3 | date: 2007 4 | abbreviation: 2BLOCK 5 | sidebar: 6 | order: 37 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Boyer-Moore]] performing a constant number of inspections in the worst case. 12 | 13 | Appeared in: 14 | 15 | - [97]: Sustik, M., Moore, J.: String searching over small alphabets. In: Technical Report TR-07-62. Department of Computer Sciences, University of Texas at Austin (2007) Exact Online String Matching Bibliography 23 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Raita.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Raita 3 | date: 1992 4 | abbreviation: RAITA 5 | sidebar: 6 | order: 19 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Modification of [[Horspool]]. It first compare the last character, then the first, and finally the middle character. If no mismatch occurs all other characters are compared. 12 | 13 | Appeared in: 14 | 15 | - [88]: Raita, T.: Tuning the boyer-moore-horspool string searching algorithm. Softw., Pract. Exper. 22(10), 879–884 (1992), http://dx.doi.org/10.1002/spe.4380221006 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Wu-Manber for Single Pattern Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Wu-Manber for Single Pattern Matching 3 | date: 2007 4 | abbreviation: HASHq 5 | sidebar: 6 | order: 38 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Horspool]] using a super alphabet. It computes a fingerprint of each q-gram in the pattern using an hash function. 12 | 13 | Appeared in: 14 | 15 | - [78]: Lecroq, T.: Fast exact string matching algorithms. Inf. Process. Lett. 102(6), 229–235 (2007), http://dx.doi.org/10.1016/j.ipl.2007.01.002 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Turbo-Reverse-Factor.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Turbo-Reverse-Factor 3 | date: 1994 4 | abbreviation: TRF 5 | sidebar: 6 | order: 64 7 | tags: 8 | - automata 9 | --- 10 | 11 | Refinement of [[Reverse-Factor]]. It remembers the characters matched in the previuos attempt. It’s complexity id $O(n)$ in time. 12 | 13 | Appeared in: 14 | 15 | - [33]: Crochemore, M., Czumaj, A., Gasieniec, L., Jarominek, S., Lecroq, T., Plandowski, W., Rytter, W.: Speeding up two string-matching algorithms. Algorithmica 12(4/5), 247–267 (1994), http://dx.doi.org/10.1007/BF01185427 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Linear DAWG Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Linear DAWG Matching 3 | date: 2005 4 | abbreviation: LDM 5 | sidebar: 6 | order: 70 7 | tags: 8 | - automata 9 | --- 10 | 11 | Combination of [[Backward-DAWG-Matching]] and [[Deterministic-Finite-Automaton]]. It uses the suffix automaton of the reverse of the pattern deterministic finite state automaton of the pattern 12 | 13 | Appeared in: 14 | 15 | - [63]: He, L., Fang, B., Sui, J.: The wide window string matching algorithm. Theor. Comput. Sci. 332(1-3), 391–404 (2005), http://dx.doi.org/10.1016/j.tcs.2004.12.002 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Wide Window.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Wide Window 3 | date: 2005 4 | abbreviation: WW 5 | sidebar: 6 | order: 69 7 | tags: 8 | - automata 9 | --- 10 | 11 | Combination of [[Forward-DAWG-Matching]] and [[Reverse-Factor]]. It uses the suffix automaton of the pattern and the prefix automaton of the reverse of the pattern. It has a linear worst case time complexity. 12 | 13 | Appeared in: 14 | 15 | - [63]: He, L., Fang, B., Sui, J.: The wide window string matching algorithm. Theor. Comput. Sci. 332(1-3), 391–404 (2005), http://dx.doi.org/10.1016/j.tcs.2004.12.002 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Boyer-Moore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Boyer-Moore 3 | date: 1977 4 | abbreviation: BM 5 | sidebar: 6 | order: 4 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Introduces the sliding window approach and the scanning of the window from right to left. It works in $O(nm)$-time. It uses the occurrence and the good-suffix heuristics. It derives from [[Brute-Force]] 12 | 13 | Appeared in: 14 | 15 | - [18]: Boyer, R.S., Moore, J.S.: A fast string searching algorithm. Commun. ACM 20(10), 762–772 (1977), http://doi.acm.org/10.1145/359842.359859 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Tailed-Substring.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tailed-Substring 3 | date: 2004 4 | abbreviation: TS 5 | sidebar: 6 | order: 32 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Brute-Force]] using a variant of the occurrence heuristics in [[Horspool]]. It uses constant extra space 12 | 13 | Appeared in: 14 | 15 | - [19]: Cantone, D., Faro, S.: Searching for a substring with constant extra-space complexity. In: Ferragina, P., Grossi, R. (eds.) Proc. of Third International Conference on Fun with algorithms. pp. 118–131 (2004) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Alpha-Skip-Search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Alpha-Skip-Search 3 | date: 1998 4 | abbreviation: ASKIP 5 | sidebar: 6 | order: 25 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Skip-Search]]. It uses buckets of positions for each factor of length log $σ(m)$ of the pattern. 12 | 13 | Appeared in: 14 | 15 | - [28]: Charras, C., Lecroq, T., Pehoushek, J.D.: A very fast string matching algorithm for small alphabeths and long patterns (extended abstract). In: Farach-Colton [41], pp. 55–64, http://dx.doi.org/10.1007/BFb0030780 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Deterministic-Finite-Automaton.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Deterministic-Finite-Automaton 3 | date: 0 4 | abbreviation: DFA 5 | sidebar: 6 | order: 61 7 | tags: 8 | - automata 9 | --- 10 | 11 | Linear algorithm using a deterministic finite state automaton recognizing all string whose suffix is equal to the pattern. Construction of the automaton can be done in $O(m)$-time. 12 | 13 | Appeared in: 14 | 15 | - [31]: Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C.: Introduction to Algorithms (3. ed.). MIT Press (2009), http://mitpress.mit.edu/books/introduction-algorithms 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Backward-Fast-Search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Backward-Fast-Search 3 | date: 2004 4 | abbreviation: BFS 5 | sidebar: 6 | order: 31 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Boyer-Moore]] and [[Horspool]]. It computes the good-suffix heuristics using information about the mismatching character 12 | 13 | Appeared in: 14 | 15 | - [22]: Cantone, D., Faro, S.: Fast-search algorithms: New efficient variants of the boyer-moore pattern-matching algorithm. Journal of Automata, Languages and Combinatorics 10(5/6), 589–608 (2005) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Knuth-Morris-Pratt Skip-Search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Knuth-Morris-Pratt Skip-Search 3 | date: 1998 4 | abbreviation: KMPS 5 | sidebar: 6 | order: 26 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Skip-Search]] using shift tables in [[Morris-Pratt]] and [[Knuth-Morris-Prat]]. 12 | 13 | Appeared in: 14 | 15 | - [28]: Charras, C., Lecroq, T., Pehoushek, J.D.: A very fast string matching algorithm for small alphabeths and long patterns (extended abstract). In: Farach-Colton [41], pp. 55–64, http://dx.doi.org/10.1007/BFb0030780 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Skip-Search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Skip-Search 3 | date: 1998 4 | abbreviation: SKIP 5 | sidebar: 6 | order: 24 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | It introduces the use of buckets of positions for each character of the alphabet. It works in $O(nm)$-time but has a linear average behavior 12 | 13 | Appeared in: 14 | 15 | - [28]: Charras, C., Lecroq, T., Pehoushek, J.D.: A very fast string matching algorithm for small alphabeths and long patterns (extended abstract). In: Farach-Colton [41], pp. 55–64, http://dx.doi.org/10.1007/BFb0030780 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/BNDM for Long patterns.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: BNDM for Long patterns 3 | date: 2000 4 | abbreviation: BNDML 5 | sidebar: 6 | order: 84 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Modification of [[Backward-Nondeterministic-DAWG-Matching]] using multiple words for simulating the nondeterministic automata of long patterns. 12 | 13 | Appeared in: 14 | 15 | - [83]: Navarro, G., Raffinot, M.: Fast and flexible string matching by combining bit-parallelism and suffix automata. ACM Journal of Experimental Algorithmics 5, 4 (2000), http://doi.acm.org/10.1145/351827.384246 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Horspool with BNDM test.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Horspool with BNDM test 3 | date: 2005 4 | abbreviation: BMHBNDM 5 | sidebar: 6 | order: 92 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Combination of [[Backward-Nondeterministic-DAWG-Matching]] and [[Horspool]] 12 | 13 | Appeared in: 14 | 15 | - [64]: Holub, J., Durian, B.: Talk: Fast variants of bit parallel approach to suffix automata. In: The Second Haifa Annual International Stringology Research Workshop of the Israeli Science Foundation, http://www.cri.haifa.ac.il/events/2005/string/presentations/Holub.pdf (2005) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Two-Way.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Two-Way 3 | date: 1991 4 | abbreviation: TW 5 | sidebar: 6 | order: 14 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Linear algorithm in the worst case. Divides the pattern in two factors. It proceeds from left to right while scanning the left factor, and proceeds from right to left while scanning the right factor. It inspects at most $2n − m$ characters. 12 | 13 | Appeared in: 14 | 15 | - [34]: Crochemore, M., Perrin, D.: Two-way string matching. J. ACM 38(3), 651–675 (1991), http://doi.acm.org/10.1145/116825.116845 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/BNDM with Horspool Shift.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: BNDM with Horspool Shift 3 | date: 2005 4 | abbreviation: BNDMBMH 5 | sidebar: 6 | order: 91 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Combination of [[Backward-Nondeterministic-DAWG-Matching]] and [[Horspool]] 12 | 13 | Appeared in: 14 | 15 | - [64]: Holub, J., Durian, B.: Talk: Fast variants of bit parallel approach to suffix automata. In: The Second Haifa Annual International Stringology Research Workshop of the Israeli Science Foundation, http://www.cri.haifa.ac.il/events/2005/string/presentations/Holub.pdf (2005) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Ahmed-Kaykobad-Chowdhury.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Ahmed-Kaykobad-Chowdhury 3 | date: 2003 4 | abbreviation: AKC 5 | sidebar: 6 | order: 28 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | A variant of [[Apostolico-Giancarlo]] that remembers all the suffixes of the pattern found in the text and that computes the shifts accordingly at the end of each attempt. 12 | 13 | Appeared in: 14 | 15 | - [1]: Ahmed, M., Kaykobad, M., Chowdhury, R.A.: A new string matching algorithm. Int. J. Comput. Math. 80(7), 825–834 (2003), http://dx.doi.org/10.1080/0020716031000087113 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Simplified BNDM with loop-unrolling.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Simplified BNDM with loop-unrolling 3 | date: 2005 4 | abbreviation: SBNDM2 5 | sidebar: 6 | order: 90 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Improvement of [[Simplified BNDM]] using a blind enrolled loop. 12 | 13 | Appeared in: 14 | 15 | - [64]: Holub, J., Durian, B.: Talk: Fast variants of bit parallel approach to suffix automata. In: The Second Haifa Annual International Stringology Research Workshop of the Israeli Science Foundation, http://www.cri.haifa.ac.il/events/2005/string/presentations/Holub.pdf (2005) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Forward-Fast-Search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Forward-Fast-Search 3 | date: 2004 4 | abbreviation: FFS 5 | sidebar: 6 | order: 30 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Fast-Search]] and [[Quick-Search]]. It computes the good-suffix using information about the character following the current window of the text 12 | 13 | Appeared in: 14 | 15 | - [22]: Cantone, D., Faro, S.: Fast-search algorithms: New efficient variants of the boyer-moore pattern-matching algorithm. Journal of Automata, Languages and Combinatorics 10(5/6), 589–608 (2005) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Improved Linear DAWG Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Improved Linear DAWG Matching 3 | date: 2006 4 | abbreviation: ILDM1 5 | sidebar: 6 | order: 71 7 | tags: 8 | - automata 9 | --- 10 | 11 | Improvement of [[Linear DAWG Matching]]. 12 | 13 | Appeared in: 14 | 15 | - [79]: Liu, C., Wang, Y., Liu, D., Li, D.: Two improved single pattern matching algorithms. In: 16th International Conference on Artificial Reality and Telexistence, ICAT 2006, Hangzhou, China, November 29 - December 1, 2006, Workshops Proceedings. pp. 419–422. IEEE Computer Society (2006), http://dx.doi.org/10.1109/ICAT.2006.134 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/BNDM with loop-unrolling.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: BNDM with loop-unrolling 3 | date: 2003 4 | abbreviation: BNDM2 5 | sidebar: 6 | order: 89 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Improvement of [[Backward-Nondeterministic-DAWG-Matching]] using a blind enrolled loop. 12 | 13 | Appeared in: 14 | 15 | - [64]: Holub, J., Durian, B.: Talk: Fast variants of bit parallel approach to suffix automata. In: The Second Haifa Annual International Stringology Research Workshop of the Israeli Science Foundation, http://www.cri.haifa.ac.il/events/2005/string/presentations/Holub.pdf (2005) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Packed String Matching/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Introduction 3 | sidebar: 4 | order: -1 5 | --- 6 | 7 | ## Algorithms based on Packed String Matching 8 | 9 | In the packed string matching technique multiple characters are packed into one larger word, so that the characters can be compared in bulk rather than individually. In this context, if the characters of a string are drawn from an alphabet of size $σ$, then $\lfloor \frac{w}{\log σ} \rfloor$ different characters fit in a single word, using $\lceil \log σ \rceil$ bits per characters. The packing factor is $α = \lfloor \frac{w}{\log σ} \rfloor$ 10 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Improved Linear DAWG Matching 2.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Improved Linear DAWG Matching 2 3 | date: 2006 4 | abbreviation: ILDM2 5 | sidebar: 6 | order: 72 7 | tags: 8 | - automata 9 | --- 10 | 11 | Improvement of [[Linear DAWG Matching]] 12 | 13 | Appeared in: 14 | 15 | - [79]: Liu, C., Wang, Y., Liu, D., Li, D.: Two improved single pattern matching algorithms. In: 16th International Conference on Artificial Reality and Telexistence, ICAT 2006, Hangzhou, China, November 29 - December 1, 2006, Workshops Proceedings. pp. 419–422. IEEE Computer Society (2006), http://dx.doi.org/10.1109/ICAT.2006.134 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Genomic Rapid Algo for String Pm.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Genomic Rapid Algo for String Pm 3 | date: 2009 4 | abbreviation: GRASPm 5 | sidebar: 6 | order: 41 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Modification of [[Horspool]]. It improve the original algorithm using a filtering method based on an hash function computed on 2-grams in the pattern 12 | 13 | Appeared in: 14 | 15 | - [36]: Deusdado, S.A.D., Carvalho, P.: Graspm: an efficient algorithm for exact pattern-matching in genomic sequences. IJBRA 5(4), 385–401 (2009), http://dx.doi.org/10.1504/IJBRA.2009.027510 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Two Sliding Windows.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Two Sliding Windows 3 | date: 2008 4 | abbreviation: TSW 5 | sidebar: 6 | order: 40 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Quick-Search]] using two sliding windows. The first windows slides from left to right while the second slides from right to left. 12 | 13 | Appeared in: 14 | 15 | - [67]: Hudaib, A., Al-Khalid, R., Suleiman, D., Itriq, M., Al-Anani, A.: A fast pattern matching algorithm with two sliding windows (tsw). Journal of Computer Science 4(5), 393–401 (2008) Exact Online String Matching Bibliography 21 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/FNDM with q-grams.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: FNDM with q-grams 3 | date: 2009 4 | abbreviation: UFNDMq 5 | sidebar: 6 | order: 102 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Implementation of [[Forward Nondeterministic DAWG Matching]] using q-grams. 12 | 13 | Appeared in: 14 | 15 | - [38]: Durian, B., Holub, J., Peltola, H., Tarhio, J.: Tuning BNDM with q-grams. In: Finocchi, I., Hershberger, J. (eds.) Proceedings of the Eleventh Workshop on Algorithm Engineering and Experiments, ALENEX 2009, New York, New York, USA, January 3, 2009. pp. 29–37. SIAM (2009), http://dx.doi.org/10.1137/1.9781611972894.3 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Simplified Forward Backward Oracle Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Simplified Forward Backward Oracle Matching 3 | date: 2009 4 | abbreviation: SFBOM 5 | sidebar: 6 | order: 77 7 | tags: 8 | - automata 9 | --- 10 | 11 | Simplification of [[Forward Backward Oracle Matching]]. 12 | 13 | Appeared in: 14 | 15 | - [40]: Fan, H., Yao, N., Ma, H.: Fast variants of the backward-oracle-marching algorithm. In: Proceedings of the 2009 Fourth International Conference on Internet Computing for Science and Engineering. pp. 56–59. ICICSE ’09, IEEE Computer Society, Washington, DC, USA (2009), http://dx.doi.org/10.1109/ICICSE.2009.53 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Forward Nondeterministic DAWG Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Forward Nondeterministic DAWG Matching 3 | date: 2005 4 | abbreviation: FNDM 5 | sidebar: 6 | order: 93 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Simulates the nondeterministic version of the automaton in [[Forward-DAWG-Matching]]. 12 | 13 | Appeared in: 14 | 15 | - [64]: Holub, J., Durian, B.: Talk: Fast variants of bit parallel approach to suffix automata. In: The Second Haifa Annual International Stringology Research Workshop of the Israeli Science Foundation, http://www.cri.haifa.ac.il/events/2005/string/presentations/Holub.pdf (2005) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Simplified Extended Backward Oracle Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Simplified Extended Backward Oracle Matching 3 | date: 2009 4 | abbreviation: SEBOM 5 | sidebar: 6 | order: 76 7 | tags: 8 | - automata 9 | --- 10 | 11 | Simplification of [[Extended Backward Oracle Matching]]. 12 | 13 | Appeared in: 14 | 15 | - [40]: Fan, H., Yao, N., Ma, H.: Fast variants of the backward-oracle-marching algorithm. In: Proceedings of the 2009 Fourth International Conference on Internet Computing for Science and Engineering. pp. 56–59. ICICSE ’09, IEEE Computer Society, Washington, DC, USA (2009), http://dx.doi.org/10.1109/ICICSE.2009.53 16 | -------------------------------------------------------------------------------- /src/components/LinkPreview.astro: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | --- 4 | 5 | 6 | 7 | 25 | 26 | 29 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Simon.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Simon 3 | date: 1994 4 | abbreviation: SIM 5 | sidebar: 6 | order: 63 7 | tags: 8 | - automata 9 | --- 10 | 11 | Modification of [[Deterministic-Finite-Automaton]]. It uses the minimal automaton of the pattern. 12 | 13 | Appeared in: 14 | 15 | - [92]: Simon, I.: String matching algorithms and automata. In: Karhum¨aki, J., Maurer, H.A., Rozenberg, G. (eds.) Results and Trends in Theoretical Computer Science, Colloquium in Honor of Arto Salomaa, Graz, Austria, June 10-11, 1994, Proceedings. Lecture Notes in Computer Science, vol. 812, pp. 386–395. Springer (1994), http://dx.doi.org/10.1007/3-540-58131-6_61 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Tuned-Boyer-Moore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Tuned-Boyer-Moore 3 | date: 1991 4 | abbreviation: TunBM 5 | sidebar: 6 | order: 15 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Variant of [[Horspool]] which introduces a fast loop with unrolled blind shifts. 12 | 13 | Appeared in: 14 | 15 | - [69]: Hume, A., Sunday, D.: Fast string searching. In: Proceedings of the Summer 1991 USENIX Conference, Nashville, TE, USA, June 1991. pp. 221–234. USENIX Association (1991) 16 | - [70]: Hume, A., Sunday, D.: Fast string searching. Softw., Pract. Exper. 21(11), 1221–1248 (1991), http://dx.doi.org/10.1002/spe.4380211105 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/BNDM with q-grams.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: BNDM with q-grams 3 | date: 2009 4 | abbreviation: BNDMq 5 | sidebar: 6 | order: 100 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Variant of [[Backward-Nondeterministic-DAWG-Matching]] using a super alphabet implemented with q-grams. 12 | 13 | Appeared in: 14 | 15 | - [38]: Durian, B., Holub, J., Peltola, H., Tarhio, J.: Tuning BNDM with q-grams. In: Finocchi, I., Hershberger, J. (eds.) Proceedings of the Eleventh Workshop on Algorithm Engineering and Experiments, ALENEX 2009, New York, New York, USA, January 3, 2009. pp. 29–37. SIAM (2009), http://dx.doi.org/10.1137/1.9781611972894.3 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Simplified BNDM with q-grams.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Simplified BNDM with q-grams 3 | date: 2009 4 | abbreviation: SBNDMq 5 | sidebar: 6 | order: 101 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Variant of [[Simplified BNDM]] using a super alphabet implemented with q-grams. 12 | 13 | Appeared in: 14 | 15 | - [38]: Durian, B., Holub, J., Peltola, H., Tarhio, J.: Tuning BNDM with q-grams. In: Finocchi, I., Hershberger, J. (eds.) Proceedings of the Eleventh Workshop on Algorithm Engineering and Experiments, ALENEX 2009, New York, New York, USA, January 3, 2009. pp. 29–37. SIAM (2009), http://dx.doi.org/10.1137/1.9781611972894.3 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Skip-Search using q-grams.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Skip-Search using q-grams 3 | date: 2016 4 | abbreviation: SKIPq 5 | sidebar: 6 | order: 60 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Skip-Search]] and [[Wu-Manber for Single Pattern Matching]]. It computes buckets of positions for the fingerprint of each q-gram in the pattern. 12 | 13 | Appeared in: 14 | 15 | - [43]: Faro, S.: A very fast string matching algorithm based on condensed alphabets. In: Algorithmic Aspects in Information and Management - 10th International Conference, AAIM 2016. Proceedings. Lecture Notes in Computer Science, Springer (2016) 16 | -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Fast Average Optimal Shift-Or.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Fast Average Optimal Shift-Or 3 | date: 2005 4 | abbreviation: FAOSO 5 | sidebar: 6 | order: 96 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Practical improvement of [[Average Optimal Shift-Or]]. 12 | 13 | Appeared in: 14 | 15 | - [58]: Fredriksson, K., Grabowski, S.: Practical and optimal string matching. In: Consens, M.P., Navarro, G. (eds.) String Processing and Information Retrieval, 12th International Conference, SPIRE 2005, Buenos Aires, Argentina, November 2-4, 2005, Proceedings. Lecture Notes in Computer Science, vol. 3772, pp. 376–387. Springer (2005), http://dx.doi.org/10.1007/11575832_42 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/SBNDM using Multiple Windows.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: SBNDM using Multiple Windows 3 | date: 2012 4 | abbreviation: SBNDMw 5 | sidebar: 6 | order: 112 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Improvement of [[Simplified BNDM]] using multiple sliding windows 12 | 13 | Appeared in: 14 | 15 | - [51]: Faro, S., Lecroq, T.: A multiple sliding windows approach to speed up string matching algorithms. In: Klasing, R. (ed.) Experimental Algorithms - 11th International Symposium, SEA 2012, Bordeaux, France, June 7-9, 2012. Proceedings. Lecture Notes in Computer Science, vol. 7276, pp. 172–183. Springer (2012), http://dx.doi.org/10.1007/978-3-642-30850-5_16 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/BSDM using q-grams and shift-xor.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: BSDM using q-grams and shift-xor 3 | date: 2016 4 | abbreviation: BSDMqx 5 | sidebar: 6 | order: 79 7 | tags: 8 | - automata 9 | --- 10 | 11 | Variant of [[Backward SNR DAWG Matching]]. It computes the DAWG assuming a super alphabet on q-grams of the pattern. The q-grams are associated to a fingerprint value computed by using a shift-xor hash function. 12 | 13 | Appeared in: 14 | 15 | - [42]: Faro, S.: Evaluation and improvement of fast algorithms for exact matching on genome sequences. In: 3rd Internanional Conference on Algorithms for Computational Biology. Lecture Notes in Computer Science, Springer (2016) 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Packed String Matching/Super Alphabet Simulation.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Super Alphabet Simulation 3 | date: 2002 4 | abbreviation: SAS 5 | sidebar: 6 | order: 118 7 | tags: 8 | - packed-string-matching 9 | --- 10 | 11 | General approach for packed string matching based on a tabulation technique. 12 | 13 | Appeared in: 14 | 15 | - [56]: Fredriksson, K.: Faster string matching with super-alphabets. In: Laender, A.H.F., Oliveira, A.L. (eds.) String Processing and Information Retrieval, 9th International Symposium, SPIRE 2002, Lisbon, Portugal, September 11-13, 2002, Proceedings. Lecture Notes in Computer Science, vol. 2476, pp. 44–57. Springer (2002), http://dx.doi.org/10.1007/3-540-45735-6_5 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Bit-Parallel2 Wide-Window.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bit-Parallel2 Wide-Window 3 | date: 2010 4 | abbreviation: BP2WW 5 | sidebar: 6 | order: 107 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Improvement of [[Wide Window]] using two sliding windows inspected in parallel 12 | 13 | Appeared in: 14 | 15 | - [25]: Cantone, D., Faro, S., Giaquinta, E.: Bit-(parallelism)2: Getting to the next level of parallelism. In: Boldi, P., Gargano, L. (eds.) Fun with Algorithms, 5th International Conference, FUN 2010, Ischia, Italy, June 2-4, 2010. Proceedings. 18 Simone Faro Lecture Notes in Computer Science, vol. 6099, pp. 166–177. Springer (2010), http://dx.doi.org/10.1007/978-3-642-13122-6_18 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Forward SBNDM using Multiple Windows.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Forward SBNDM using Multiple Windows 3 | date: 2012 4 | abbreviation: FSBNDMw 5 | sidebar: 6 | order: 113 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Improvement of [[Forward Simplified BNDM]] using multiple sliding windows. 12 | 13 | Appeared in: 14 | 15 | - [51]: Faro, S., Lecroq, T.: A multiple sliding windows approach to speed up string matching algorithms. In: Klasing, R. (ed.) Experimental Algorithms - 11th International Symposium, SEA 2012, Bordeaux, France, June 7-9, 2012. Proceedings. Lecture Notes in Computer Science, vol. 7276, pp. 172–183. Springer (2012), http://dx.doi.org/10.1007/978-3-642-30850-5_16 16 | -------------------------------------------------------------------------------- /src/components/Timeline.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Graphviz from "./Graphviz.astro"; 3 | import { dotTimeline, type TimelineItem } from "./timeline"; 4 | 5 | interface Props { 6 | items: TimelineItem[]; 7 | /** 8 | * https://www.graphviz.org/doc/info/attrs.html#d:rankdir 9 | */ 10 | direction?: "TB" | "BT" | "LR" | "RL"; 11 | } 12 | 13 | const src = dotTimeline(Astro.props); 14 | --- 15 | 16 |
17 | 18 |
19 | 20 | 33 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Bit-Parallel Wide-Window2.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bit-Parallel Wide-Window2 3 | date: 2010 4 | abbreviation: BPWW2 5 | sidebar: 6 | order: 108 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Improvement of [[Wide Window]] using two sliding windows inspected in parallel. 12 | 13 | Appeared in: 14 | 15 | - [25]: Cantone, D., Faro, S., Giaquinta, E.: Bit-(parallelism)2: Getting to the next level of parallelism. In: Boldi, P., Gargano, L. (eds.) Fun with Algorithms, 5th International Conference, FUN 2010, Ischia, Italy, June 2-4, 2010. Proceedings. 18 Simone Faro Lecture Notes in Computer Science, vol. 6099, pp. 166–177. Springer (2010), http://dx.doi.org/10.1007/978-3-642-13122-6_18 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Q-Gram Filtering.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Q-Gram Filtering 3 | date: 2010 4 | abbreviation: QF 5 | sidebar: 6 | order: 106 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | It uses a filtering approach based on consecutive q-grams in the text 12 | 13 | Appeared in: 14 | 15 | - [39]: Durian, B., Peltola, H., Salmela, L., Tarhio, J.: Bit-parallel search algorithms for long patterns. In: Festa, P. (ed.) Experimental Algorithms, 9th International Symposium, SEA 2010, Ischia Island, Naples, Italy, May 20-22, 2010. Proceedings. Lecture Notes in Computer Science, vol. 6049, pp. 129–140. Springer (2010), http://dx.doi.org/10.1007/978-3-642-13193-6_12 Exact Online String Matching Bibliography 19 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Packed String Matching/Packed Belazzougui-Raffinot.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Packed Belazzougui-Raffinot 3 | date: 2010 4 | abbreviation: PBR 5 | sidebar: 6 | order: 122 7 | tags: 8 | - packed-string-matching 9 | --- 10 | 11 | Efficient packed string matching algorithm which works in $O(nm)$ worst case time complexity 12 | 13 | Appeared in: 14 | 15 | - [12]: Belazzougui, D., Raffinot, M.: Average optimal string matching in packed strings. In: Spirakis, P.G., Serna, M.J. (eds.) Algorithms and Complexity, 8th International Conference, CIAC 2013, Barcelona, Spain, May 22-24, 2013. Proceedings. Lecture Notes in Computer Science, vol. 7878, pp. 37–48. Springer (2013), http://dx.doi.org/10.1007/978-3-642-38233-8_4 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Thathoo-Virmani-Sai-Balakrishnan-Sekar.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Thathoo-Virmani-Sai-Balakrishnan-Sekar 3 | date: 2006 4 | abbreviation: TVSBS 5 | sidebar: 6 | order: 34 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Sheik-Sumit-Anindya-Balakrishnan-Sekar]] and [[Berry-Ravindran]]. 12 | 13 | Appeared in: 14 | 15 | - [66]: Huang, Y., Ping, L., Pan, X., Cai, G.: A fast exact pattern matching algorithmfor biological sequences. In: Proceedings of the 2008 International Conference on BioMedical Engineering and Informatics, BMEI 2008, May 28-30, 2008, Sanya, Hainan, China - Volume 1. pp. 8–12. IEEE Computer Society (2008), http://dx.doi.org/10.1109/BMEI.2008.154 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Bit-Parallel Length Invariant Matcher.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bit-Parallel Length Invariant Matcher 3 | date: 2008 4 | abbreviation: BLIM 5 | sidebar: 6 | order: 99 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Quadratic worst case time algorithm using multiple words 12 | 13 | Appeared in: 14 | 15 | - [75]: Külekci, M.O.: A method to overcome computer word size limitation in bit-parallel pattern matching. In: Hong, S., Nagamochi, H., Fukunaga, T. (eds.) Algorithms and Computation, 19th International Symposium, ISAAC 2008, Gold Coast, Australia, December 15-17, 2008. Proceedings. Lecture Notes in Computer Science, vol. 5369, pp. 496–506. Springer (2008), http://dx.doi.org/10.1007/978-3-540-92182-0_45 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Hashq using Multiple Hashing Functions.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Hashq using Multiple Hashing Functions 3 | date: 2012 4 | abbreviation: MHASHq 5 | sidebar: 6 | order: 50 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Wu-Manber for Single Pattern Matching]] using multiple hash functions in order to reduce the number false positives 12 | 13 | Appeared in: 14 | 15 | - [49]: Faro, S., Lecroq, T.: Fast searching in biological sequences using multiple hash functions. In: 12th IEEE International Conference on Bioinformatics & Bioengineering, BIBE 2012, Larnaca, Cyprus, November 11-13, 2012. pp. 175–180. IEEE Computer Society (2012), http://dx.doi.org/10.1109/BIBE.2012.6399669 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Shift Vector Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Shift Vector Matching 3 | date: 2003 4 | abbreviation: SVM 5 | sidebar: 6 | order: 88 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Implementation of [[Boyer-Moore]] using bit parallelism. It remembers characters matched during the last attempt. 12 | 13 | Appeared in: 14 | 15 | - [85]: Peltola, H., Tarhio, J.: Alternative algorithms for bit-parallel string matching. In: Nascimento, M.A., de Moura, E.S., Oliveira, A.L. (eds.) String Processing and Information Retrieval, 10th International Symposium, SPIRE 2003, Manaus, Brazil, October 8-10, 2003, Proceedings. Lecture Notes in Computer Science, vol. 2857, pp. 80–94. Springer (2003), http://dx.doi.org/10.1007/978-3-540-39984-1_7 16 | -------------------------------------------------------------------------------- /src/components/publications.ts: -------------------------------------------------------------------------------- 1 | import { bdb } from "../lib/braindb.mjs"; 2 | import { type TimelineItem } from "./timeline"; 3 | 4 | export async function publications() { 5 | return (await bdb.documents()) 6 | .map((doc) => { 7 | const fm = doc.frontmatter(); 8 | if (!fm.abbreviation) return false; 9 | return { 10 | id: fm.abbreviation as string, 11 | year: fm.date as number, 12 | tooltip: " ", //doc.title(), 13 | // @ts-ignore 14 | class: fm.tags[0], 15 | url: doc.url(), 16 | out: doc 17 | .documentsFrom() 18 | .map((x) => x.frontmatter().abbreviation as string) 19 | .filter(Boolean), 20 | }; 21 | }) 22 | .filter(Boolean) as TimelineItem[]; 23 | } 24 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Average Optimal Shift-Or.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Average Optimal Shift-Or 3 | date: 2005 4 | abbreviation: AOSO 5 | sidebar: 6 | order: 95 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Variant of [[Shift-Or]] using a superimposed pattern. It improves the original algorithm by shifting of more than one position during the scan 12 | 13 | Appeared in: 14 | 15 | - [58]: Fredriksson, K., Grabowski, S.: Practical and optimal string matching. In: Consens, M.P., Navarro, G. (eds.) String Processing and Information Retrieval, 12th International Conference, SPIRE 2005, Buenos Aires, Argentina, November 2-4, 2005, Proceedings. Lecture Notes in Computer Science, vol. 3772, pp. 376–387. Springer (2005), http://dx.doi.org/10.1007/11575832_42 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Improved Two-Way Shift-Or.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Improved Two-Way Shift-Or 3 | date: 2014 4 | abbreviation: TSO 5 | sidebar: 6 | order: 115 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Improvement of [[Shift-Or]] using several sliding windows inspected in parallel 12 | 13 | Appeared in: 14 | 15 | - [37]: Durian, B., Chhabra, T., Ghuman, S.S., Hirvola, T., Peltola, H., Tarhio, J.: Improved two-way bit-parallel search. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2014, Prague, Czech Republic, September 1-3, 2014. pp. 71–83. Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2014), http://www.stringology.org/event/2014/p08.html 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Fast-Search using Multiple Windows.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Fast-Search using Multiple Windows 3 | date: 2012 4 | abbreviation: FSw 5 | sidebar: 6 | order: 45 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Fast-Search]] using multiple sliding windows. Windows slides from left to right and from right to left 12 | 13 | Appeared in: 14 | 15 | - [51]: Faro, S., Lecroq, T.: A multiple sliding windows approach to speed up string matching algorithms. In: Klasing, R. (ed.) Experimental Algorithms - 11th International Symposium, SEA 2012, Bordeaux, France, June 7-9, 2012. Proceedings. Lecture Notes in Computer Science, vol. 7276, pp. 172–183. Springer (2012), http://dx.doi.org/10.1007/978-3-642-30850-5_16 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Improved Two-Way Shift-And.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Improved Two-Way Shift-And 3 | date: 2014 4 | abbreviation: TSA 5 | sidebar: 6 | order: 114 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Improvement of [[Shift-And]] using several sliding windows inspected in parallel. 12 | 13 | Appeared in: 14 | 15 | - [37]: Durian, B., Chhabra, T., Ghuman, S.S., Hirvola, T., Peltola, H., Tarhio, J.: Improved two-way bit-parallel search. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2014, Prague, Czech Republic, September 1-3, 2014. pp. 71–83. Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2014), http://www.stringology.org/event/2014/p08.html 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Backward SNR DAWG Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Backward SNR DAWG Matching 3 | date: 2012 4 | abbreviation: BSDM 5 | sidebar: 6 | order: 78 7 | tags: 8 | - automata 9 | --- 10 | 11 | Modification of [[Backward-DAWG-Matching]]. It uses the DAWG constructed on the longest substring of the pattern with no repetitions of characters. 12 | 13 | Appeared in: 14 | 15 | - [50]: Faro, S., Lecroq, T.: A fast suffix automata based algorithm for exact online string matching. In: Moreira, N., Reis, R. (eds.) Implementation and Application of Automata - 17th International Conference, CIAA 2012, Porto, Portugal, July 17-20, 2012. Proceedings. Lecture Notes in Computer Science, vol. 7381, pp. 149–158. Springer (2012), http://dx.doi.org/10.1007/978-3-642-31606-7_13 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Small Alphabet Bit-Parallel.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Small Alphabet Bit-Parallel 3 | date: 2009 4 | abbreviation: SABP 5 | sidebar: 6 | order: 103 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Bit Parallel algorithm designed for searching string over small alphabets. It is based on a position related character matching table. 12 | 13 | Appeared in: 14 | 15 | - [100]: Zhang, G., Zhu, E., Mao, L., Yin, M.: A bit-parallel exact string matching algorithm for small alphabet. In: Deng, X., Hopcroft, J.E., Xue, J. (eds.) Frontiers in Algorithmics, Third International Workshop, FAW 2009, Hefei, China, June 20-23, 2009. Proceedings. Lecture Notes in Computer Science, vol. 5598, pp. 336–345. Springer (2009), http://dx.doi.org/10.1007/978-3-642-02270-8_34 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/BNDMq Long.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: BNDMq Long 3 | date: 2010 4 | abbreviation: BQL 5 | sidebar: 6 | order: 105 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Modification of [[Backward-Nondeterministic-DAWG-Matching]] for long patterns. It increases the effective alphabet size by using overlapping q-grams. 12 | 13 | Appeared in: 14 | 15 | - [39]: Durian, B., Peltola, H., Salmela, L., Tarhio, J.: Bit-parallel search algorithms for long patterns. In: Festa, P. (ed.) Experimental Algorithms, 9th International Symposium, SEA 2010, Ischia Island, Naples, Italy, May 20-22, 2010. Proceedings. Lecture Notes in Computer Science, vol. 6049, pp. 129–140. Springer (2010), http://dx.doi.org/10.1007/978-3-642-13193-6_12 Exact Online String Matching Bibliography 19 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/TVSBS using Multiple Windows.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: TVSBS using Multiple Windows 3 | date: 2012 4 | abbreviation: TVSBSw 5 | sidebar: 6 | order: 46 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Thathoo-Virmani-Sai-Balakrishnan-Sekar]] using multiple sliding windows. Windows slides from left to right and from right to left. 12 | 13 | Appeared in: 14 | 15 | - [51]: Faro, S., Lecroq, T.: A multiple sliding windows approach to speed up string matching algorithms. In: Klasing, R. (ed.) Experimental Algorithms - 11th International Symposium, SEA 2012, Bordeaux, France, June 7-9, 2012. Proceedings. Lecture Notes in Computer Science, vol. 7276, pp. 172–183. Springer (2012), http://dx.doi.org/10.1007/978-3-642-30850-5_16 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Packed String Matching/Packed String Search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Packed String Search 3 | date: 2009 4 | abbreviation: PSS 5 | sidebar: 6 | order: 119 7 | tags: 8 | - packed-string-matching 9 | --- 10 | 11 | Variant of [[Knuth-Morris-Prat]] applied to packed string matching. 12 | 13 | Appeared in: 14 | 15 | - [16]: Bille, P.: Fast searching in packed strings. In: Kucherov, G., Ukkonen, E. (eds.) Combinatorial Pattern Matching, 20th Annual Symposium, CPM 2009, Lille, France, June 22-24, 2009, Proceedings. Lecture Notes in Computer Science, vol. 5577, pp. 116–126. Springer (2009), http://dx.doi.org/10.1007/978-3-642-02441-2_11 16 | - [17]: Bille, P.: Fast searching in packed strings. J. Discrete Algorithms 9(1), 49–56(2011), http://dx.doi.org/10.1016/j.jda.2010.09.003 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Shift-And.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Shift-And 3 | date: 1989 4 | abbreviation: SA 5 | sidebar: 6 | order: 82 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Simulates the nondeterministic version of the automaton in [[Deterministic-Finite-Automaton]]. 12 | 13 | Appeared in: 14 | 15 | - [8]: Baeza-Yates, R.A., Gonnet, G.H.: A new approach to text searching. In: Belkin, N.J., van Rijsbergen, C.J. (eds.) SIGIR’89, 12th International Conference on Research and Development in Information Retrieval, Cambridge, Massachusetts, USA, June 25-28, 1989, Proceedings. pp. 168–175. ACM (1989), http://doi.acm.org/10.1145/75334.75352 16 | - [9]: Baeza-Yates, R.A., Gonnet, G.H.: A new approach to text searching. Commun. ACM 35(10), 74–82 (1992), http://doi.acm.org/10.1145/135239.135243 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Shift-Or.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Shift-Or 3 | date: 1989 4 | abbreviation: SO 5 | sidebar: 6 | order: 81 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Simulates the nondeterministic version of the automaton in [[Deterministic-Finite-Automaton]]. 12 | 13 | Appeared in: 14 | 15 | - [8]: Baeza-Yates, R.A., Gonnet, G.H.: A new approach to text searching. In: Belkin, N.J., van Rijsbergen, C.J. (eds.) SIGIR’89, 12th International Conference on Research and Development in Information Retrieval, Cambridge, Massachusetts, USA, June 25-28, 1989, Proceedings. pp. 168–175. ACM (1989), http://doi.acm.org/10.1145/75334.75352 16 | - [9]: Baeza-Yates, R.A., Gonnet, G.H.: A new approach to text searching. Commun. ACM 35(10), 74–82 (1992), http://doi.acm.org/10.1145/135239.135243 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Berry-Ravindran.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Berry-Ravindran 3 | date: 1999 4 | abbreviation: BR 5 | sidebar: 6 | order: 27 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Quick-Search]] and [[Zhu-Takaoka]]. It uses the two consecutive characters, after the current window, for computing the occurrence heuristics 12 | 13 | Appeared in: 14 | 15 | - [15]: Berry, T., Ravindran, S.: A fast string matching algorithm and experimental results. In: Holub, J., Sim´anek, M. (eds.) Proceedings of the Prague Stringology Club Workshop 1999, Prague, Czech Republic, July 8-9, 1999. pp. 16–28. Department of Computer Science and Engineering, Faculty of Electrical Engineering, Czech Technical University (1999), http://www.stringology.org/event/1999/p2.html 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Introduction 3 | sidebar: 4 | order: -1 5 | --- 6 | 7 | ## Algorithms based on Bit Parallelism 8 | 9 | Bit-parallelism [8,9] is a technique used for simulating nondeterministic automata. Specifically the bit-parallelism technique takes advantage of the intrinsic parallelism of the bitwise operations inside a computer word, allowing to cut down the number of operations that an algorithm performs by a factor up to $w$, 10 | where $w$ is the number of bits in the computer word. However the correspondent encoding requires one bit per pattern symbol, for a total of $m/w$ computer words. Thus, as long as a pattern fits in a computer word, bit-parallel algorithms are extremely fast, otherwise their performances degrades considerably as $m/w$ 11 | grows. 12 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Two-Way Nondeterministic DAWG Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Two-Way Nondeterministic DAWG Matching 3 | date: 2003 4 | abbreviation: TNDM 5 | sidebar: 6 | order: 86 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | A two-way modification of [[Backward-Nondeterministic-DAWG-Matching]]. It scans a pattern suffix forward before normal backward scan. 12 | 13 | Appeared in: 14 | 15 | - [85]: Peltola, H., Tarhio, J.: Alternative algorithms for bit-parallel string matching. In: Nascimento, M.A., de Moura, E.S., Oliveira, A.L. (eds.) String Processing and Information Retrieval, 10th International Symposium, SPIRE 2003, Manaus, Brazil, October 8-10, 2003, Proceedings. Lecture Notes in Computer Science, vol. 2857, pp. 80–94. Springer (2003), http://dx.doi.org/10.1007/978-3-540-39984-1_7 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Bounded Boyer-Moore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bounded Boyer-Moore 3 | date: 2010 4 | abbreviation: BBM 5 | sidebar: 6 | order: 42 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Boyer-Moore]] using a bounded good-suffix heuristics with constant extra space. 12 | 13 | Appeared in: 14 | 15 | - [20]: Cantone, D., Cristofaro, S., Faro, S.: A space-efficient implementation of the goodsuffix heuristic. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2010, Prague, Czech Republic, August 30 - September 1, 2010. pp. 63–75. Prague Stringology Club, Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2010), http://www.stringology.org/event/2010/p06.html 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Bounded Fast-Search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bounded Fast-Search 3 | date: 2010 4 | abbreviation: BoFS 5 | sidebar: 6 | order: 43 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Fast-Search]] using a bounded good-suffix heuristics with constant extra space. 12 | 13 | Appeared in: 14 | 15 | - [20]: Cantone, D., Cristofaro, S., Faro, S.: A space-efficient implementation of the goodsuffix heuristic. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2010, Prague, Czech Republic, August 30 - September 1, 2010. pp. 63–75. Prague Stringology Club, Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2010), http://www.stringology.org/event/2010/p06.html 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Galil-Seiferas.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Galil-Seiferas 3 | date: 1981 4 | abbreviation: GS 5 | sidebar: 6 | order: 6 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Linear algorithm using constant extra space complexity. Preprocessing in $O(m)$-time. It performs $5n$ text character comparisons in the worst case. 12 | 13 | Appeared in: 14 | 15 | - [60]: Galil, Z., Seiferas, J.I.: Time-space-optimal string matching. In: Proceedings of the 13th Annual ACM Symposium on Theory of Computing, May 11-13, 1981, Milwaukee, Wisconsin, USA. pp. 106–113. ACM (1981), http://doi.acm.org/10.1145/800076.802463 16 | - [61]: Galil, Z., Seiferas, J.I.: Time-space-optimal string matching. J. Comput. Syst. Sci. 26(3), 280–294 (1983), http://dx.doi.org/10.1016/0022-0000(83)90002-8 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Backward-Oracle-Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Backward-Oracle-Matching 3 | date: 1999 4 | abbreviation: BOM 5 | sidebar: 6 | order: 67 7 | tags: 8 | - automata 9 | --- 10 | 11 | Variant of [[Reverse-Factor]]. It uses the Factor Oracle of the pattern. It is the first filtering algorithm using automata. 12 | 13 | Appeared in: 14 | 15 | - [3]: Allauzen, C., Crochemore, M., Raffinot, M.: Factor oracle: A new structure for pattern matching. In: Pavelka, J., Tel, G., Bartosek, M. (eds.) SOFSEM ’99, Theory and Practice of Informatics, 26th Conference on Current Trends in Theory and Practice of Informatics, Milovy, Czech Republic, November 27 - December 4, 1999, Proceedings. Lecture Notes in Computer Science, vol. 1725, pp. 295–310. Springer (1999), http://dx.doi.org/10.1007/3-540-47849-3_18 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Long patterns BNDM.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Long patterns BNDM 3 | date: 2003 4 | abbreviation: LBNDM 5 | sidebar: 6 | order: 87 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Modification of [[Backward-Nondeterministic-DAWG-Matching]] for long patterns. The automaton is constructed over a superimposed pattern constructed on the $m/w$ consecutive factors of the inout pattern 12 | 13 | Appeared in: 14 | 15 | - [85]: Peltola, H., Tarhio, J.: Alternative algorithms for bit-parallel string matching. In: Nascimento, M.A., de Moura, E.S., Oliveira, A.L. (eds.) String Processing and Information Retrieval, 10th International Symposium, SPIRE 2003, Manaus, Brazil, October 8-10, 2003, Proceedings. Lecture Notes in Computer Science, vol. 2857, pp. 80–94. Springer (2003), http://dx.doi.org/10.1007/978-3-540-39984-1_7 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Bounded Forward-Fast-Search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bounded Forward-Fast-Search 3 | date: 2010 4 | abbreviation: BFFS 5 | sidebar: 6 | order: 44 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Forward-Fast-Search]] using a bounded forward-good-suffix heuristics with constant extra space. 12 | 13 | Appeared in: 14 | 15 | - [20]: Cantone, D., Cristofaro, S., Faro, S.: A space-efficient implementation of the goodsuffix heuristic. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2010, Prague, Czech Republic, August 30 - September 1, 2010. pp. 63–75. Prague Stringology Club, Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2010), http://www.stringology.org/event/2010/p06.html 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Turbo-Boyer-Moore.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Turbo-Boyer-Moore 3 | date: 1992 4 | abbreviation: TBM 5 | sidebar: 6 | order: 21 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Boyer-Moore]]. It remembers characters inspected in the previous attempt. It performs at most $2n$ character inspections. 12 | 13 | Appeared in: 14 | 15 | - [53]: Finkel, A., Jantzen, M. (eds.): STACS 92, 9th Annual Symposium on Theoretical Aspects of Computer Science, Cachan, France, February 13-15, 1992, Proceedings, Lecture Notes in Computer Science, vol. 577. Springer (1992) 16 | - [33]: Crochemore, M., Czumaj, A., Gasieniec, L., Jarominek, S., Lecroq, T., Plandowski, W., Rytter, W.: Speeding up two string-matching algorithms. Algorithmica 12(4/5), 247–267 (1994), http://dx.doi.org/10.1007/BF01185427 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Two-Way Shift-Or using q-grams.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Two-Way Shift-Or using q-grams 3 | date: 2014 4 | abbreviation: TSOq 5 | sidebar: 6 | order: 117 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Improvement of [[Shift-Or]] using several sliding windows inspected in parallel. It improves the performances by simulating a super alphabet with q-grams 12 | 13 | Appeared in: 14 | 15 | - [37]: Durian, B., Chhabra, T., Ghuman, S.S., Hirvola, T., Peltola, H., Tarhio, J.: Improved two-way bit-parallel search. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2014, Prague, Czech Republic, September 1-3, 2014. pp. 71–83. Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2014), http://www.stringology.org/event/2014/p08.html 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Simplified BNDM.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Simplified BNDM 3 | date: 2003 4 | abbreviation: SBNDM 5 | sidebar: 6 | order: 85 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Improvement of [[Backward-Nondeterministic-DAWG-Matching]]. 12 | 13 | Appeared in: 14 | 15 | - [85]: Peltola, H., Tarhio, J.: Alternative algorithms for bit-parallel string matching. In: Nascimento, M.A., de Moura, E.S., Oliveira, A.L. (eds.) String Processing and Information Retrieval, 10th International Symposium, SPIRE 2003, Manaus, Brazil, October 8-10, 2003, Proceedings. Lecture Notes in Computer Science, vol. 2857, pp. 80–94. Springer (2003), http://dx.doi.org/10.1007/978-3-540-39984-1_7 16 | - [81]: Navarro, G.: Nr-grep: a fast and flexible pattern-matching tool. Softw., Pract. Exper. 31(13), 1265–1312 (2001), http://dx.doi.org/10.1002/spe.411 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Two-Way Shift-And using q-grams.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Two-Way Shift-And using q-grams 3 | date: 2014 4 | abbreviation: TSAq 5 | sidebar: 6 | order: 116 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Improvement of [[Shift-And]] using several sliding windows inspected in parallel. It improves the performances by simulating a super alphabet with q-grams 12 | 13 | Appeared in: 14 | 15 | - [37]: Durian, B., Chhabra, T., Ghuman, S.S., Hirvola, T., Peltola, H., Tarhio, J.: Improved two-way bit-parallel search. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2014, Prague, Czech Republic, September 1-3, 2014. pp. 71–83. Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2014), http://www.stringology.org/event/2014/p08.html 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Packed String Matching/Streaming SIMD Extensions Filter.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Streaming SIMD Extensions Filter 3 | date: 2009 4 | abbreviation: SSEF 5 | sidebar: 6 | order: 120 7 | tags: 8 | - packed-string-matching 9 | --- 10 | 11 | Extension of [[Skip-Search]] to packed string matching. It is implemented using SSE instructions. It works only for long patterns. 12 | 13 | Appeared in: 14 | 15 | - [76]: Külekci, M.O.: Filter based fast matching of long patterns by using SIMD instructions. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2009, Prague, Czech Republic, August 31 - September 2, 2009. pp. 118–128. Prague Stringology Club, Department of Computer Science and Engineering, Faculty of Electrical Engineering, Czech Technical University in Prague (2009), http://www.stringology.org/event/2009/p11.html 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/BNDM with Extended Shifts.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: BNDM with Extended Shifts 3 | date: 2010 4 | abbreviation: BXS 5 | sidebar: 6 | order: 104 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Modification of [[Backward-Nondeterministic-DAWG-Matching]] for long patterns. The automaton is constructed over a superimposed pattern constructed on the $m/w$ consecutive factors of the input pattern 12 | 13 | Appeared in: 14 | 15 | - [39]: Durian, B., Peltola, H., Salmela, L., Tarhio, J.: Bit-parallel search algorithms for long patterns. In: Festa, P. (ed.) Experimental Algorithms, 9th International Symposium, SEA 2010, Ischia Island, Naples, Italy, May 20-22, 2010. Proceedings. Lecture Notes in Computer Science, vol. 6049, pp. 129–140. Springer (2010), http://dx.doi.org/10.1007/978-3-642-13193-6_12 Exact Online String Matching Bibliography 19 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Boyer-Moore-Horspool with q-grams.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Boyer-Moore-Horspool with q-grams 3 | date: 2008 4 | abbreviation: BMHq 5 | sidebar: 6 | order: 39 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Horspool]] using a super alphabet. It computes the occurrence heuristics reading q-grams in a single operation. 12 | 13 | Appeared in: 14 | 15 | - [72]: Kalsi, P., Peltola, H., Tarhio, J.: Comparison of exact string matching algorithms for biological sequences. In: Elloumi, M., K¨ung, J., Linial, M., Murphy, R.F., Schneider, K., Toma, C. (eds.) Bioinformatics Research and Development, Second International Conference, BIRD 2008, Vienna, Austria, July 7-9, 2008, Proceedings. Communications in Computer and Information Science, vol. 13, pp. 417–426. Springer (2008), http://dx.doi.org/10.1007/978-3-540-70600-7_31 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Quantum Leap Quick-Search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Quantum Leap Quick-Search 3 | date: 2015 4 | abbreviation: QLQS 5 | sidebar: 6 | order: 57 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Quick-Search]]. It improves the shift performed by the occurrence heuristics by computing the shift to left performed by the reverse of the pattern at a given fixed distance from the current window. 12 | 13 | Appeared in: 14 | 15 | - [98]: Watson, B.W., Kourie, D.G., Cleophas, L.G.: Quantum leap pattern matching. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2015, Prague, Czech Republic, August 24-26, 2015. pp. 104–117. Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2015), http://www.stringology.org/event/2015/p11.html 16 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Franek-Jennings-Smyth.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Franek-Jennings-Smyth 3 | date: 2007 4 | abbreviation: FJS 5 | sidebar: 6 | order: 36 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Combination of [[Knuth-Morris-Prat]] and [[Quick-Search]]. 12 | 13 | Appeared in: 14 | 15 | - [54]: Franek, F., Jennings, C.G., Smyth, W.F.: A simple fast hybrid pattern-matching algorithm. In: Apostolico, A., Crochemore, M., Park, K. (eds.) Combinatorial Pattern Matching, 16th Annual Symposium, CPM 2005, Jeju Island, Korea, June 19-22, 2005, Proceedings. Lecture Notes in Computer Science, vol. 3537, pp. 288–297. Springer (2005), http://dx.doi.org/10.1007/11496656_25 16 | - [55]: Franek, F., Jennings, C.G., Smyth, W.F.: A simple fast hybrid pattern-matching algorithm. J. Discrete Algorithms 5(4), 682–695 (2007), http://dx.doi.org/10.1016/j.jda.2006.11.004 17 | -------------------------------------------------------------------------------- /src/components/Graphviz.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Graphviz as GraphvizWasm } from "@hpcc-js/wasm/graphviz"; 3 | const graphviz = await GraphvizWasm.load(); 4 | 5 | interface Props { 6 | src: string; 7 | } 8 | 9 | const { src } = Astro.props; 10 | 11 | let svg = graphviz 12 | .dot(src) 13 | .replace(``, "") 14 | .replace( 15 | ``, 17 | "" 18 | ); 19 | 20 | const widthMatch = svg.match(/width="(\d+)([^"]+)"/); 21 | if (widthMatch) svg = svg.replace(widthMatch[0], ""); 22 | 23 | const heightMatch = svg.match(/height="(\d+)([^"]+)"/); 24 | if (heightMatch) svg = svg.replace(heightMatch[0], ""); 25 | 26 | // TODO: remove html comments 27 | --- 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Introduction 3 | sidebar: 4 | order: -1 5 | --- 6 | 7 | ## Algorithms based on Automata 8 | 9 | Also automata play a very important role in the design of efficient string matching algorithms. For instance, the [[Deterministic-Finite-Automaton|Deterministic Finite Automaton Matcher]] [31] was one of the first linear-time solutions, whereas the [[Backward-DAWG-Matching]] algorithm [35] reached the optimal $O(\frac{n \log_{σ} m}{m})$ lower bound time complexity on the average. Both of them are based on finite automata; in particular, they respectively simulate a deterministic automaton for the language $Σ^∗p$ and the deterministic suffix automaton of the reverse of $p$. 10 | 11 | The efficiency of string matching algorithms depends on the underlying automaton used for recognizing the pattern $p$ and on the encoding used for simulating it. 12 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Double Forward DAWG Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Double Forward DAWG Matching 3 | date: 2000 4 | abbreviation: DFDM 5 | sidebar: 6 | order: 68 7 | tags: 8 | - automata 9 | --- 10 | 11 | Modification of [[Forward-DAWG-Matching]]. It works in linear worst case time using a DAWG of the pattern and a DAWG of the reverse of the pattern. 12 | 13 | Appeared in: 14 | 15 | - [4]: Allauzen, C., Raffinot, M.: Simple optimal string matching algorithm. In: Giancarlo, R., Sankoff, D. (eds.) Combinatorial Pattern Matching, 11th Annual Symposium, CPM 2000, Montreal, Canada, June 21-23, 2000, Proceedings. Lecture Notes in Computer Science, vol. 1848, pp. 364–374. Springer (2000), http://dx.doi.org/10.1007/3-540-45123-4_30 16 | - [5]: Allauzen, C., Raffinot, M.: Simple optimal string matching algorithm. J. Algorithms 36(1), 102–116 (2000), http://dx.doi.org/10.1006/jagm.2000.1087 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Improved Occurrence Heuristics.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Improved Occurrence Heuristics 3 | date: 2013 4 | abbreviation: IOM 5 | sidebar: 6 | order: 53 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Horspool]]. It uses an improvement of the occurrence heuristics. 12 | 13 | Appeared in: 14 | 15 | - [23]: Cantone, D., Faro, S.: Improved and self-tuned occurrence heuristics. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2013, Prague, Czech Republic, September 2-4, 2013. pp. 92–106. Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2013), http://www.stringology.org/event/2013/p09.html 16 | - [24]: Cantone, D., Faro, S.: Improved and self-tuned occurrence heuristics. J. Discrete Algorithms 28, 73–84 (2014), http://dx.doi.org/10.1016/j.jda.2014.07.006 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Forward Simplified BNDM.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Forward Simplified BNDM 3 | date: 2008 4 | abbreviation: FSBNDM 5 | sidebar: 6 | order: 98 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Combination of [[Simplified BNDM]] and [[Forward BNDM]]. 12 | 13 | Appeared in: 14 | 15 | - [46]: Faro, S., Lecroq, T.: Efficient variants of the backward-oracle-matching algorithm. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2008, Prague, Czech Republic, September 1-3, 2008. pp. 146–160. Prague Stringology Club, Department of Computer Science and Engineering, Faculty of Electrical Engineering, Czech Technical University in Prague (2008), http://www.stringology.org/event/2008/p14.html 16 | - [47]: Faro, S., Lecroq, T.: Efficient variants of the backward-oracle-matching algorithm. Int. J. Found. Comput. Sci. 20(6), 967–984 (2009), http://dx.doi.org/10.1142/S0129054109006991 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Packed String Matching/Exact Packed String Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Exact Packed String Matching 3 | date: 2013 4 | abbreviation: EPSM 5 | sidebar: 6 | order: 124 7 | tags: 8 | - packed-string-matching 9 | --- 10 | 11 | Improvement of [[Streaming SIMD Extensions Filter]]. It uses SSE instruction to speed up searching. It consists in four different algorithms depending on the length of the pattern. 12 | 13 | Appeared in: 14 | 15 | - [44]: Faro, S., Külekci, M.O.: Fast packed string matching for short patterns. In: Sanders, P., Zeh, N. (eds.) Proceedings of the 15th Meeting on Algorithm Engineering and Experiments, ALENEX 2013, New Orleans, Louisiana, USA, January 7, 2013. pp. 113–121. SIAM (2013), http://dx.doi.org/10.1137/1.9781611972931.10 16 | - [45]: Faro, S., K¨ulekci, M.O.: Fast and flexible packed string matching. J. Discrete Algorithms 28, 61–72 (2014), http://dx.doi.org/10.1016/j.jda.2014.07.003 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Packed String Matching/Packed Belazzougui.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Packed Belazzougui 3 | date: 2010 4 | abbreviation: PB 5 | sidebar: 6 | order: 121 7 | tags: 8 | - packed-string-matching 9 | --- 10 | 11 | Efficient packed string matching algorithm which works in $O(n/α+occ)$-time when $α ≤ m ≤ n/α$. 12 | 13 | Appeared in: 14 | 15 | - [10]: Belazzougui, D.: Worst case efficient single and multiple string matching in the RAM model. In: Iliopoulos, C.S., Smyth, W.F. (eds.) Combinatorial Algorithms - 21st International Workshop, IWOCA 2010, London, UK, July 26-28, 2010, Revised Selected Papers. Lecture Notes in Computer Science, vol. 6460, pp. 90–102. Springer (2010), http://dx.doi.org/10.1007/978-3-642-19222-7_10 16 | - [11]: Belazzougui, D.: Worst-case efficient single and multiple string matching on packed texts in the word-ram model. J. Discrete Algorithms 14, 91–106 (2012), http://dx.doi.org/10.1016/j.jda.2011.12.011 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Forward BNDM.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Forward BNDM 3 | date: 2008 4 | abbreviation: FBNDM 5 | sidebar: 6 | order: 97 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Simulates the nondeterministic version of the automaton in [[Forward Backward Oracle Matching]] 12 | 13 | Appeared in: 14 | 15 | - [46]: Faro, S., Lecroq, T.: Efficient variants of the backward-oracle-matching algorithm. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2008, Prague, Czech Republic, September 1-3, 2008. pp. 146–160. Prague Stringology Club, Department of Computer Science and Engineering, Faculty of Electrical Engineering, Czech Technical University in Prague (2008), http://www.stringology.org/event/2008/p14.html 16 | - [47]: Faro, S., Lecroq, T.: Efficient variants of the backward-oracle-matching algorithm. Int. J. Found. Comput. Sci. 20(6), 967–984 (2009), http://dx.doi.org/10.1142/S0129054109006991 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Worst Occurrence Heuristics.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Worst Occurrence Heuristics 3 | date: 2013 4 | abbreviation: WOM 5 | sidebar: 6 | order: 54 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Horspool]]. It computes the occurrence heuristics on the positions which leads to the average maximal shift. 12 | 13 | Appeared in: 14 | 15 | - [23]: Cantone, D., Faro, S.: Improved and self-tuned occurrence heuristics. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2013, Prague, Czech Republic, September 2-4, 2013. pp. 92–106. Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2013), http://www.stringology.org/event/2013/p09.html 16 | - [24]: Cantone, D., Faro, S.: Improved and self-tuned occurrence heuristics. J. Discrete Algorithms 28, 73–84 (2014), http://dx.doi.org/10.1016/j.jda.2014.07.006 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Extended Backward Oracle Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Extended Backward Oracle Matching 3 | date: 2008 4 | abbreviation: EBOM 5 | sidebar: 6 | order: 73 7 | tags: 8 | - automata 9 | --- 10 | 11 | Improvement of [[Backward-Oracle-Matching]]. It performs transitions of two characters at each step 12 | 13 | Appeared in: 14 | 15 | - [46]: Faro, S., Lecroq, T.: Efficient variants of the backward-oracle-matching algorithm. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2008, Prague, Czech Republic, September 1-3, 2008. pp. 146–160. Prague Stringology Club, Department of Computer Science and Engineering, Faculty of Electrical Engineering, Czech Technical University in Prague (2008), http://www.stringology.org/event/2008/p14.html 16 | - [47]: Faro, S., Lecroq, T.: Efficient variants of the backward-oracle-matching algorithm. Int. J. Found. Comput. Sci. 20(6), 967–984 (2009), http://dx.doi.org/10.1142/S0129054109006991 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Fast-Search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Fast-Search 3 | date: 2003 4 | abbreviation: FS 5 | sidebar: 6 | order: 29 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Boyer-Moore]]. It uses the occurrence heuristics when the mismatch occurs during the first comparison. 12 | 13 | Appeared in: 14 | 15 | - [21]: Cantone, D., Faro, S.: Fast-search: A new efficient variant of the boyer-moore string matching algorithm. In: Jansen, K., Margraf, M., Mastrolilli, M., Rolim, J.D.P. (eds.) Experimental and Efficient Algorithms, Second International Workshop, WEA 2003, Ascona, Switzerland, May 26-28, 2003, Proceedings. Lecture Notes in Computer Science, vol. 2647, pp. 47–58. Springer (2003), http://dx.doi.org/10.1007/3-540-44867-5_4 16 | - [22]: Cantone, D., Faro, S.: Fast-search algorithms: New efficient variants of the boyer-moore pattern-matching algorithm. Journal of Automata, Languages and Combinatorics 10(5/6), 589–608 (2005) 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Forward SBNDM using q-grams and Lookahead.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Forward SBNDM using q-grams and Lookahead 3 | date: 2011 4 | abbreviation: FSBNDMqf 5 | sidebar: 6 | order: 111 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Improvement of [[Forward Simplified BNDM]] which implements a super alphabet with q-grams and computing the shift with a lookahead of several characters. 12 | 13 | Appeared in: 14 | 15 | - [86]: Peltola, H., Tarhio, J.: Variations of forward-sbndm. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2011, Prague, Czech Republic, August 29-31, 2011. pp. 3–14. Prague Stringology Club, Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2011), http://www.stringology.org/event/2011/p02.html 16 | - [87]: Peltola, H., Tarhio, J.: String matching with lookahead. Discrete Applied Mathematics 163, 352–360 (2014), http://dx.doi.org/10.1016/j.dam.2013.10.034 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/Jumping Occurrence Heuristics.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Jumping Occurrence Heuristics 3 | date: 2013 4 | abbreviation: JOM 5 | sidebar: 6 | order: 55 7 | tags: 8 | - comparison-of-characters 9 | --- 10 | 11 | Improvement of [[Berry-Ravindran]]. It computes the occurrence heuristics on two non consecutive characters with a distance depending on the average maximal shift. 12 | 13 | Appeared in: 14 | 15 | - [23]: Cantone, D., Faro, S.: Improved and self-tuned occurrence heuristics. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2013, Prague, Czech Republic, September 2-4, 2013. pp. 92–106. Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2013), http://www.stringology.org/event/2013/p09.html 16 | - [24]: Cantone, D., Faro, S.: Improved and self-tuned occurrence heuristics. J. Discrete Algorithms 28, 73–84 (2014), http://dx.doi.org/10.1016/j.jda.2014.07.006 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Automata/Forward Backward Oracle Matching.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Forward Backward Oracle Matching 3 | date: 2008 4 | abbreviation: FBOM 5 | sidebar: 6 | order: 74 7 | tags: 8 | - automata 9 | --- 10 | 11 | Combination of [[Extended Backward Oracle Matching]] and [[Quick-Search]]. It performs transitions using the characters which follows the current window of the text 12 | 13 | Appeared in: 14 | 15 | - [46]: Faro, S., Lecroq, T.: Efficient variants of the backward-oracle-matching algorithm. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2008, Prague, Czech Republic, September 1-3, 2008. pp. 146–160. Prague Stringology Club, Department of Computer Science and Engineering, Faculty of Electrical Engineering, Czech Technical University in Prague (2008), http://www.stringology.org/event/2008/p14.html 16 | - [47]: Faro, S., Lecroq, T.: Efficient variants of the backward-oracle-matching algorithm. Int. J. Found. Comput. Sci. 20(6), 967–984 (2009), http://dx.doi.org/10.1142/S0129054109006991 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Comparison of Characters/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Introduction 3 | sidebar: 4 | order: -1 5 | --- 6 | 7 | ## Algorithms based on Comparison of Characters 8 | 9 | In a computational model where the matching algorithm is restricted to read all the characters of the text one by one the optimal complexity is $O(n)$, and was achieved the first time by the well known [[Morris-Pratt]] algorithm [80]. However, in many practical cases it is possible to avoid reading all the characters of the text achieving sub-linear performances on the average. 10 | 11 | The optimal average $O(\frac{n \log_{σ} m}{m})$ time complexity [99] was reached by many comparison based algorithms. However, all algorithms with a sub-linear average behavior may have to read all the text characters in the worst case. It is interesting to note that many of those algorithms have an even worse $O(nm)$-time 12 | complexity in the worst-case [48,52]. 13 | 14 | In what follows we present the list of all string matching algorithms based on comparison of characters. 15 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Factorized BNDM.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Factorized BNDM 3 | date: 2010 4 | abbreviation: KBNDM 5 | sidebar: 6 | order: 110 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Simulates the nondeterministic version of the automaton in [[Backward-Nondeterministic-DAWG-Matching]] using a more compact representation of the automaton. It is based on a factorization of the pattern. 12 | 13 | Appeared in: 14 | 15 | - [26]: Cantone, D., Faro, S., Giaquinta, E.: A compact representation of nondeterministic (suffix) automata for the bit-parallel approach. In: Amir, A., Parida, L. (eds.) Combinatorial Pattern Matching, 21st Annual Symposium, CPM 2010, New York, NY, USA, June 21-23, 2010. Proceedings. Lecture Notes in Computer Science, vol. 6129, pp. 288–298. Springer (2010), http://dx.doi.org/10.1007/978-3-642-13509-5_26 16 | - [27]: Cantone, D., Faro, S., Giaquinta, E.: A compact representation of nondeterministic (suffix) automata for the bit-parallel approach. Inf. Comput. 213, 3–12 (2012), http://dx.doi.org/10.1016/j.ic.2011.03.006 17 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Bit Parallelism/Factorized Shift-And.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Factorized Shift-And 3 | date: 2010 4 | abbreviation: KSA 5 | sidebar: 6 | order: 109 7 | tags: 8 | - bit-parallelism 9 | --- 10 | 11 | Simulates the nondeterministic version of the automaton in [[Deterministic-Finite-Automaton]] using a more compact representation of the automaton. It is based on a factorization of the pattern. 12 | 13 | Appeared in: 14 | 15 | - [26]: Cantone, D., Faro, S., Giaquinta, E.: A compact representation of nondeterministic (suffix) automata for the bit-parallel approach. In: Amir, A., Parida, L. (eds.) Combinatorial Pattern Matching, 21st Annual Symposium, CPM 2010, New York, NY, USA, June 21-23, 2010. Proceedings. Lecture Notes in Computer Science, vol. 6129, pp. 288–298. Springer (2010), http://dx.doi.org/10.1007/978-3-642-13509-5_26 16 | - [27]: Cantone, D., Faro, S., Giaquinta, E.: A compact representation of nondeterministic (suffix) automata for the bit-parallel approach. Inf. Comput. 213, 3–12 (2012), http://dx.doi.org/10.1016/j.ic.2011.03.006 17 | -------------------------------------------------------------------------------- /src/components/RecentChanges.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { bdb } from "../lib/braindb.mjs"; 3 | import type { Document } from "@braindb/core"; 4 | 5 | const docs = await bdb.documents({ sort: ["updated_at", "desc"] }); 6 | 7 | const docsByDate = new Map(); 8 | docs.forEach((doc) => { 9 | if (doc.frontmatter().tags) { 10 | const date = doc.updatedAt().toISOString().split("T")[0]; 11 | docsByDate.set(date, docsByDate.get(date) || []); 12 | docsByDate.get(date)?.push(doc); 13 | } 14 | }); 15 | const dates = Array.from(docsByDate.keys()).map((d) => [ 16 | d, 17 | d.split("-").reverse().join("."), 18 | ]); 19 | --- 20 | 21 |
22 | 23 | { 24 | dates.map(([key, title]) => ( 25 |

26 | {title} 27 |

    28 | {docsByDate.get(key)?.map((doc) => ( 29 |
  • 30 | {doc.title()} 31 |
  • 32 | ))} 33 |
34 |

35 | )) 36 | } 37 |
38 |
39 | -------------------------------------------------------------------------------- /src/content/docs/algorithms/Packed String Matching/Crochemore-Perrin algorithm using SSE instructions.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Crochemore-Perrin algorithm using SSE instructions 3 | date: 2011 4 | abbreviation: SSECP 5 | sidebar: 6 | order: 123 7 | tags: 8 | - packed-string-matching 9 | --- 10 | 11 | Modification of [[Two-Way]] for packed string matching. It is based on two specialized packed string instructions. 12 | 13 | Appeared in: 14 | 15 | - [13]: Ben-Kiki, O., Bille, P., Breslauer, D., Gasieniec, L., Grossi, R., Weimann, O.: Optimal packed string matching. In: Chakraborty, S., Kumar, A. (eds.) IARCS Annual Conference on Foundations of Software Technology and Theoretical Computer Science, FSTTCS 2011, December 12-14, 2011, Mumbai, India. LIPIcs, Exact Online String Matching Bibliography 17 vol. 13, pp. 423–432. Schloss Dagstuhl - Leibniz-Zentrum fuer Informatik (2011), http://dx.doi.org/10.4230/LIPIcs.FSTTCS.2011.423 16 | - [14]: Ben-Kiki, O., Bille, P., Breslauer, D., Gasieniec, L., Grossi, R., Weimann, O.: Towards optimal packed string matching. Theor. Comput. Sci. 525, 111–129 (2014), http://dx.doi.org/10.1016/j.tcs.2013.06.013 17 | -------------------------------------------------------------------------------- /src/components/svgpanzoom.ts: -------------------------------------------------------------------------------- 1 | import "@beoe/pan-zoom/css/PanZoomUi.css"; 2 | import { PanZoomUi } from "@beoe/pan-zoom"; 3 | 4 | // for BEOE diagrams 5 | document.querySelectorAll(".beoe").forEach((container) => { 6 | const element = container.firstElementChild; 7 | if (!element) return; 8 | // @ts-expect-error 9 | new PanZoomUi({ element, container }).on(); 10 | }); 11 | 12 | // for content images 13 | document 14 | .querySelectorAll( 15 | ".sl-markdown-content > img[src$='.svg' i]," + 16 | ".sl-markdown-content > p > img[src$='.svg' i]," + 17 | // for development environment 18 | ".sl-markdown-content > img[src$='f=svg' i]," + 19 | ".sl-markdown-content > img[src$='f=svg' i]" 20 | ) 21 | .forEach((element) => { 22 | if (element.parentElement?.tagName === "PICTURE") { 23 | element = element.parentElement; 24 | } 25 | const container = document.createElement("figure"); 26 | container.classList.add("beoe", "not-content"); 27 | element.replaceWith(container); 28 | container.append(element); 29 | // @ts-expect-error 30 | new PanZoomUi({ element, container }).on(); 31 | }); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "digital-garden", 3 | "type": "module", 4 | "version": "0.0.1", 5 | "scripts": { 6 | "dev": "astro dev", 7 | "start": "astro dev", 8 | "build": "astro check && astro build", 9 | "preview": "astro preview", 10 | "astro": "astro" 11 | }, 12 | "dependencies": { 13 | "@astrojs/check": "^0.7.0", 14 | "@astrojs/markdown-remark": "^5.1.1", 15 | "@astrojs/starlight": "^0.24.4", 16 | "@beoe/pan-zoom": "^0.0.3", 17 | "@braindb/core": "^0.0.13", 18 | "@braindb/remark-wiki-link": "^2.1.0", 19 | "@floating-ui/dom": "^1.6.6", 20 | "@hpcc-js/wasm": "^2.17.1", 21 | "@pagefind/default-ui": "^1.1.0", 22 | "astro": "^4.11.3", 23 | "astro-robots-txt": "^1.0.0", 24 | "github-slugger": "^2.0.0", 25 | "graphology": "^0.25.4", 26 | "graphology-layout": "^0.6.1", 27 | "graphology-layout-forceatlas2": "^0.10.1", 28 | "graphology-svg": "^0.1.3", 29 | "graphology-utils": "^2.5.2", 30 | "katex": "^0.16.10", 31 | "mkdirp": "^3.0.1", 32 | "rehype-autolink-headings": "^7.1.0", 33 | "rehype-external-links": "^3.0.0", 34 | "rehype-katex": "^7.0.0", 35 | "remark-math": "^6.0.0", 36 | "sharp": "^0.33.4", 37 | "typescript": "^5.5.2" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/components/Tags.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import type { CollectionEntry } from "astro:content"; 3 | interface Props { 4 | entry: CollectionEntry<"docs">; 5 | } 6 | const { entry } = Astro.props; 7 | --- 8 | 9 | 15 | 16 |
17 | { 18 | entry.data.tags && entry.data.tags.length > 0 && ( 19 | <> 20 |

Tags

21 |
    22 | {entry.data.tags.map((x) => ( 23 |
  • 24 | #{x} 25 |
  • 26 | ))} 27 |
28 | 29 | ) 30 | } 31 |
32 | 33 | 54 | -------------------------------------------------------------------------------- /src/components/TagList.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { getCollection } from "astro:content"; 3 | 4 | const docs = await getCollection("docs"); 5 | type Docs = typeof docs; 6 | const docsByTags = new Map(); 7 | docs.forEach((doc) => { 8 | if (doc.data.tags) { 9 | doc.data.tags.forEach((tag: string) => { 10 | docsByTags.set(tag, docsByTags.get(tag) || []); 11 | docsByTags.get(tag)?.push(doc); 12 | }); 13 | } 14 | }); 15 | const comparator = new Intl.Collator("en"); 16 | const tagsSorted = [...docsByTags.keys()].sort(comparator.compare); 17 | --- 18 | 19 | 25 | 26 |
27 | 28 | { 29 | tagsSorted.map((tag) => ( 30 |

31 | #{tag} 32 |

    33 | {docsByTags.get(tag)?.map((doc) => ( 34 |
  • 35 | {doc.data.title} 36 |
  • 37 | ))} 38 |
39 |

40 | )) 41 | } 42 |
43 |
44 | -------------------------------------------------------------------------------- /src/components/Alphabetical.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { getCollection } from "astro:content"; 3 | 4 | const firstChar = (str: string) => String.fromCodePoint(str.codePointAt(0)!); 5 | 6 | const docs = await getCollection("docs"); 7 | type Docs = typeof docs; 8 | const docsByChar = new Map(); 9 | docs.forEach((doc) => { 10 | if (doc.data.tags) { 11 | const char = firstChar(doc.data.title).toUpperCase(); 12 | docsByChar.set(char, docsByChar.get(char) || []); 13 | docsByChar.get(char)?.push(doc); 14 | } 15 | }); 16 | const comparator = new Intl.Collator("en"); 17 | const charsSorted = [...docsByChar.keys()].sort(comparator.compare); 18 | --- 19 | 20 | 26 | 27 |
28 | 29 | { 30 | charsSorted.map((char) => ( 31 |

32 | {char} 33 |

    34 | {docsByChar.get(char)?.map((doc) => ( 35 |
  • 36 | {doc.data.title} 37 |
  • 38 | ))} 39 |
40 |

41 | )) 42 | } 43 |
44 |
45 | -------------------------------------------------------------------------------- /src/components/Backlinks.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { bdb } from "../lib/braindb.mjs"; 3 | import type { CollectionEntry } from "astro:content"; 4 | interface Props { 5 | entry: CollectionEntry<"docs">; 6 | } 7 | const { entry } = Astro.props; 8 | 9 | const doc = await bdb.findDocument(`/${entry.id}`); 10 | --- 11 | 12 | 18 | 19 | 35 | 36 | 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Exact Online String Matching 2 | 3 | [![Netlify Status](https://api.netlify.com/api/v1/badges/23562080-f0ef-40d0-9536-7811caccaefe/deploy-status)](https://app.netlify.com/sites/exact-online-string-matching/deploys) 4 | 5 | [Demo of timeline diagram (aka chronology, aka genealogical tree)](https://exact.stereobooster.com). All content taken from [Exact Online String Matching Bibliography](https://arxiv.org/pdf/1605.05067.pdf) (all credits goes to the original author). 6 | 7 | ## TODO 8 | 9 | - expose page with diagram alone to allow embeding with iframe 10 | - expose daigram as SVG file to allow downloading 11 | - show metadata in sidebar 12 | - client-side content-graph. I can render it on the server side, but I don't like it 13 | - use the same colors as in timeline visualisation 14 | - add data from other papers 15 | - [Exact String Matching Algorithms: Survey, Issues, and Future Research Directions](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8703383) 16 | - [Technology Beats Algorithms (in Exact String Matching)](https://arxiv.org/pdf/1612.01506.pdf) 17 | - [Exact string matching algorithms](https://www-igm.univ-mlv.fr/~lecroq/string/) 18 | - [The String Matching Algorithms Research Tool](https://www.dmi.unict.it/faro/papers/conference/faro47.pdf) 19 | - [The Exact Online String Matching Problem: a Review of the Most Recent Results](https://www-igm.univ-mlv.fr/~lecroq/articles/acmsurv2013.pdf) 20 | - [A guided tour to approximate string matching](https://users.dcc.uchile.cl/~gnavarro/ps/acmcs01.1.pdf) 21 | - [Offline Approximate String Matching for Information Retrieval: An experiment on technical documentation](https://hj.diva-portal.org/smash/get/diva2:663931/FULLTEXT01.pdf) 22 | -------------------------------------------------------------------------------- /src/components/Graph.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { renderer, DEFAULTS } from "./graphRenderer"; 3 | 4 | export interface Props { 5 | graph: any; 6 | } 7 | 8 | const { graph } = Astro.props; 9 | 10 | // probably need to use cache here 11 | const result = renderer(graph, { 12 | ...DEFAULTS, 13 | width: 800, 14 | height: 800, 15 | }); 16 | --- 17 | 18 | 24 | 25 |
26 | 27 |
28 | 29 | 62 | -------------------------------------------------------------------------------- /src/components/timeline.ts: -------------------------------------------------------------------------------- 1 | export type TimelineItem = { 2 | id: string; 3 | year: number; 4 | tooltip?: string; 5 | class?: string; 6 | label?: string; 7 | url?: string; 8 | in?: string[]; 9 | out?: string[]; 10 | }; 11 | 12 | export type DotTimelineProps = { 13 | items: TimelineItem[]; 14 | /** 15 | * https://www.graphviz.org/doc/info/attrs.html#d:rankdir 16 | */ 17 | direction?: "TB" | "BT" | "LR" | "RL"; 18 | }; 19 | 20 | export function dotTimeline({ items, direction }: DotTimelineProps) { 21 | const byYears: Record = {}; 22 | 23 | items.forEach((item) => { 24 | byYears[item.year] = byYears[item.year] || []; 25 | byYears[item.year].push(item.id); 26 | }); 27 | 28 | return `digraph timeline { 29 | ${direction ? `rankdir=${direction}` : ""} 30 | bgcolor="transparent"; 31 | size="7,8"; 32 | 33 | edge [style=invis]; 34 | node [fontsize=24, shape = plaintext]; 35 | 36 | ${Object.keys(byYears).sort().join(` -> `)} 37 | 0[label=" "] 38 | 39 | node [fontsize=20, shape = box]; 40 | 41 | ${Object.keys(byYears) 42 | .sort() 43 | .map( 44 | (year) => 45 | `{ rank=same; "${year}" ${byYears[year] 46 | .map((x) => `"${x}"`) 47 | .join(" ")}; }` 48 | ) 49 | .join("\n")} 50 | 51 | edge[style=solid]; 52 | 53 | ${items 54 | .map( 55 | (item) => 56 | `"${item.id}"[${item.url ? `URL="${item.url}"` : ""} ${ 57 | item.label ? `label="${item.label}"` : "" 58 | } ${item.class ? `class="${item.class}"` : ""} ${ 59 | item.tooltip ? `tooltip="${item.tooltip}"` : "" 60 | }];` 61 | ) 62 | .join("\n")} 63 | 64 | ${items 65 | .map((item) => 66 | !item.in 67 | ? "" 68 | : item.in.map((id) => `"${id}" -> "${item.id}";`).join("\n") 69 | ) 70 | .join("\n")} 71 | 72 | ${items 73 | .map((item) => 74 | !item.out 75 | ? "" 76 | : item.out.map((id) => `"${item.id}" -> "${id}";`).join("\n") 77 | ) 78 | .join("\n")} 79 | }`; 80 | } 81 | -------------------------------------------------------------------------------- /src/content/docs/index.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: Chronology of Exact Online String Matching Algorithms 3 | prev: false 4 | next: false 5 | tableOfContents: false 6 | template: splash 7 | --- 8 | 9 | Since 1970 more than **120** string matching algorithms have been proposed. In this diagram shown almost all of them. The list is updated to **May 2016**. From [Exact Online String Matching Bibliography](https://arxiv.org/pdf/1605.05067.pdf) 10 | 11 | **Try: zoom, drag diagram below 👇 or hover, click nodes.** 12 | 13 | import Publications from "../../components/Publications.astro"; 14 | 15 | 16 | 17 | ## About demo 18 | 19 | This demo is to show the potential of modern Jamstack and alternative ideas for publishing Second Brain / Digital Garden. 20 | 21 | ### Markdown as "graph" database 22 | 23 | - Data for timeline directly queried from markdown files. No need to maintain a separate file. 24 | - Connection between nodes automatically discovered based on links (markdown links or wiki links). 25 | 26 | ### No JS diagram 27 | 28 | - Diagram fully generated on the server (at build time in case of Jamstack). So it works even without JS - no need for Mermaid or d3 on the client 29 | - Diagram is embedded SVG, which allows 30 | - to add HTML links to it 31 | - style it with CSS classes, for example, to add dark theme support 32 | 33 | ### Progressively enhanced diagram 34 | 35 | On top of static SVG, there is a small JS added to: 36 | 37 | - to allow drag/zoom diagram 38 | - to show HTML reach snippets when the user hovers over a node 39 | - snippet is HTML page generated based on markdown from the file 40 | 41 | ## Technology 42 | 43 | - [Astro + Braindb](https://astro-digital-garden.stereobooster.com/recipes/braindb/) 44 | - [Graphviz compiled to WASM](https://www.npmjs.com/package/@hpcc-js/wasm) 45 | 46 | ## Related 47 | 48 | - [Digital garden about fuzzy string matching](https://fuzzy.stereobooster.com/) 49 | - [Chronology of parsers](https://parsing.stereobooster.com/other/chronology-of-parsers/) 50 | - [History of programming languages](https://rigaux.org/language-study/diagram.html). This is where I took the original idea of Graphviz visualization 51 | -------------------------------------------------------------------------------- /src/lib/graph.ts: -------------------------------------------------------------------------------- 1 | import { BrainDB } from "@braindb/core"; 2 | import { bdb } from "./braindb.mjs"; 3 | import graphology from "graphology"; 4 | import circular from "graphology-layout/circular"; 5 | import forceAtlas2 from "graphology-layout-forceatlas2"; 6 | // @ts-ignore 7 | const { MultiGraph } = graphology; 8 | 9 | const prefix = "/algorithms"; 10 | 11 | export async function toGraphologyJson(db: BrainDB) { 12 | const nodes = (await db.documents()) 13 | .map((document) => ({ 14 | key: document.id(), 15 | attributes: { 16 | label: document.frontmatter().title as string, 17 | url: document.url(), 18 | // size: 0.05, 19 | // color: "#f00" 20 | }, 21 | })) 22 | .filter((x) => x.attributes.url.startsWith(prefix)); 23 | 24 | const edges = (await db.links()) 25 | .filter((link) => link.to() !== null && link.to()?.url().startsWith(prefix)) 26 | .map((link) => ({ 27 | source: link.from().id(), 28 | target: link.to()?.id(), 29 | })); 30 | 31 | // const tagsAll = (await db.documents()) 32 | // .map((document) => { 33 | // const tags = document.frontmatter().tags; 34 | // return Array.isArray(tags) ? tags : []; 35 | // }) 36 | // .flat(); 37 | 38 | // const tagNodes = [...new Set(tagsAll)].map((tag) => ({ 39 | // key: tag, 40 | // attributes: { 41 | // label: tag, 42 | // url: "", 43 | // size: 0.4, 44 | // }, 45 | // })); 46 | 47 | // const tagEdges = (await db.documents()) 48 | // .map((document) => { 49 | // const tags = document.frontmatter().tags; 50 | // if (!Array.isArray(tags)) return []; 51 | // return tags.map((tag) => ({ 52 | // source: tag, 53 | // target: document.id(), 54 | // })); 55 | // }) 56 | // .flat(); 57 | 58 | return { 59 | attributes: { name: "g" }, 60 | options: { 61 | allowSelfLoops: true, 62 | multi: true, 63 | type: "directed", 64 | }, 65 | nodes, //: [...nodes, ...tagNodes], 66 | edges, //: [...edges, ...tagEdges], 67 | }; 68 | } 69 | 70 | export async function getGraph() { 71 | const graph = new MultiGraph(); 72 | const data = await toGraphologyJson(bdb); 73 | graph.import(data as any); 74 | circular.assign(graph); 75 | forceAtlas2.assign(graph, 2000); 76 | return graph; 77 | } 78 | -------------------------------------------------------------------------------- /src/styles/custom.css: -------------------------------------------------------------------------------- 1 | @import url(katex/dist/katex.min.css); 2 | 3 | .no-select { 4 | user-select: none; 5 | } 6 | 7 | /* text in mermaid diagram partially hidden otherwise */ 8 | svg .node .label { 9 | line-height: 1.2; 10 | } 11 | 12 | .flowchart-link { 13 | stroke: var(--sl-color-white) !important; 14 | } 15 | 16 | .marker { 17 | stroke: var(--sl-color-white) !important; 18 | fill: var(--sl-color-white) !important; 19 | } 20 | 21 | /* links in headers */ 22 | .sl-markdown-content :is(h1, h2, h3, h4, h5, h6) { 23 | a { 24 | text-decoration: none; 25 | font-size: 1.3rem; 26 | margin-left: 0.5rem; 27 | /* emoji silhouette */ 28 | color: transparent !important; 29 | } 30 | 31 | &:hover a { 32 | /* emoji silhouette */ 33 | text-shadow: 0 0 0 var(--sl-color-text-accent); 34 | } 35 | 36 | .icon.icon-link::after { 37 | /* content: "#"; */ 38 | /* content: "⚓"; */ 39 | content: "🔗"; 40 | } 41 | } 42 | 43 | .graphology { 44 | text { 45 | fill: var(--sl-color-white) !important; 46 | } 47 | 48 | line { 49 | stroke-width: 2px; 50 | } 51 | } 52 | 53 | .broken-link { 54 | text-decoration: underline; 55 | color: red; 56 | } 57 | 58 | .column-list { 59 | column-width: calc(var(--sl-content-width) / 2 - 1.5rem); 60 | 61 | ul { 62 | padding: 0; 63 | list-style: none; 64 | margin-top: 0 !important; 65 | } 66 | } 67 | 68 | @media (min-width: 72rem) { 69 | .sl-container { 70 | margin-inline: var(--sl-content-margin-inline, 0) !important; 71 | } 72 | } 73 | 74 | svg.icon.text { 75 | display: inline-block !important; 76 | margin: 0 0 -0.25rem 0 !important; 77 | } 78 | 79 | .timeline { 80 | .automata { 81 | polygon { 82 | fill: lightblue; 83 | stroke: lightblue; 84 | } 85 | text { 86 | fill: black; 87 | } 88 | } 89 | .comparison-of-characters { 90 | polygon { 91 | fill: lightpink; 92 | stroke: lightpink; 93 | } 94 | text { 95 | fill: black; 96 | } 97 | } 98 | .bit-parallelism { 99 | polygon { 100 | fill: lavender; 101 | stroke: lavender; 102 | } 103 | text { 104 | fill: black; 105 | } 106 | } 107 | .packed-string-matching { 108 | polygon { 109 | fill: #c0ff3e; 110 | stroke: #c0ff3e; 111 | } 112 | text { 113 | fill: black; 114 | } 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /src/lib/braindb.mjs: -------------------------------------------------------------------------------- 1 | import { slug as githubSlug } from "github-slugger"; 2 | import path from "node:path"; 3 | import process from "node:process"; 4 | import { BrainDB } from "@braindb/core"; 5 | 6 | // import { dirname } from "node:path"; 7 | // import { mkdirp } from "mkdirp"; 8 | // import { writeFileSync, readFileSync } from "node:fs"; 9 | // const references = readFileSync(path.resolve(process.cwd(), "references.txt")).toString().split("\n"); 10 | 11 | // slug implementation according to Astro 12 | // see astro/packages/astro/src/content/utils.ts 13 | const generateSlug = (filePath) => { 14 | const withoutFileExt = filePath.replace( 15 | new RegExp(path.extname(filePath) + "$"), 16 | "" 17 | ); 18 | const rawSlugSegments = withoutFileExt.split(path.sep); 19 | const slug = rawSlugSegments 20 | // Slugify each route segment to handle capitalization and spaces. 21 | // Note: using `slug` instead of `new Slugger()` means no slug deduping. 22 | .map((segment) => githubSlug(segment)) 23 | .join("/") 24 | .replace(/\/index$/, ""); 25 | 26 | return slug; 27 | }; 28 | 29 | const start = new Date().getTime(); 30 | 31 | export const bdb = new BrainDB({ 32 | root: path.resolve(process.cwd(), "src/content/docs"), 33 | url: (filePath, _frontmatter) => `${generateSlug(filePath)}/`, 34 | git: process.cwd(), 35 | storeMarkdown: false, 36 | // need to configure caching in Netlify in order to use this 37 | // - https://github.com/siakaramalegos/netlify-plugin-cache-folder 38 | // - https://github.com/netlify/build/tree/main/packages/cache-utils 39 | // dbPath: process.cwd(), 40 | }); 41 | 42 | bdb.start(); 43 | 44 | // let first = false; 45 | bdb.on("*", (action, opts) => { 46 | // if (first && action === "create" && opts.document.frontmatter().tags) { 47 | // let md = opts.document.markdown(); 48 | // const docRegexp = /\((\d+)\)/g; 49 | 50 | // [...md.matchAll(docRegexp)].forEach((x) => { 51 | // const id = parseInt(x[1]); 52 | // const docs = bdb.documentsSync({ 53 | // frontmatter: { sidebar: { order: id } }, 54 | // }); 55 | // const doc = docs[0]; 56 | // if (doc) { 57 | // md = md.replaceAll(x[0], `[[${doc.slug()}]]`); 58 | // } else { 59 | // console.log(`Failed to find ${x[0]}`); 60 | // } 61 | // }); 62 | 63 | // const refRegexp = /Appeared in \\\[([\d\,]+)\]/g; 64 | 65 | // [...md.matchAll(refRegexp)].forEach((x) => { 66 | // console.log() 67 | // md = md.replace(x[0], "").replaceAll("\n\n", "\n") 68 | // md = md + "\nAppeared in:\n\n" 69 | // x[1].split(",").forEach(ref => { 70 | // md = md + `- \[${ref}]: ${references[parseInt(ref) - 1]}\n` 71 | // }) 72 | // }) 73 | 74 | // const mdPath = process.cwd() + `/tmp` + opts.document.path(); 75 | // mkdirp.sync(dirname(mdPath)); 76 | // writeFileSync(mdPath, md, { 77 | // encoding: "utf8", 78 | // }); 79 | // // first = false; 80 | // } 81 | 82 | if (action === "ready") 83 | console.log(`BrainDB ready: ${new Date().getTime() - start}ms`); 84 | 85 | if (opts) { 86 | opts.document 87 | .unresolvedLinks() 88 | .forEach((link) => 89 | console.log( 90 | `Unresolved link: ${link 91 | .from() 92 | .path()}:${link.line()}:${link.column()}` 93 | ) 94 | ); 95 | } 96 | }); 97 | -------------------------------------------------------------------------------- /astro.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "astro/config"; 2 | import starlight from "@astrojs/starlight"; 3 | import rehypeExternalLinks from "rehype-external-links"; 4 | import remarkMath from "remark-math"; 5 | import rehypeKatex from "rehype-katex"; 6 | import { rehypeHeadingIds } from "@astrojs/markdown-remark"; 7 | import rehypeAutolinkHeadings from "rehype-autolink-headings"; 8 | import robotsTxt from "astro-robots-txt"; 9 | 10 | import remarkWikiLink from "@braindb/remark-wiki-link"; 11 | import { bdb } from "./src/lib/braindb.mjs"; 12 | 13 | await bdb.ready(); 14 | 15 | // https://astro.build/config 16 | export default defineConfig({ 17 | site: "https://exact.stereobooster.com", 18 | integrations: [ 19 | starlight({ 20 | title: "Exact Online String Matching", 21 | social: { 22 | github: "https://github.com/stereobooster/exact-online-string-matching", 23 | }, 24 | editLink: { 25 | baseUrl: 26 | "https://github.com/stereobooster/exact-online-string-matching/edit/main/", 27 | }, 28 | sidebar: [ 29 | { 30 | label: "Algorithms", 31 | collapsed: true, 32 | autogenerate: { 33 | directory: "algorithms", 34 | }, 35 | }, 36 | ], 37 | customCss: ["./src/styles/custom.css"], 38 | components: { 39 | PageFrame: "./src/components/PageFrame.astro", 40 | TableOfContents: "./src/components/TableOfContents.astro", 41 | // Hero: "./src/components/Hero.astro", 42 | }, 43 | lastUpdated: true, 44 | }), 45 | robotsTxt(), 46 | ], 47 | markdown: { 48 | remarkPlugins: [ 49 | remarkMath, 50 | [ 51 | remarkWikiLink, 52 | { 53 | linkTemplate: ({ slug, alias }) => { 54 | const [slugWithoutAnchor, anchor] = slug.split("#"); 55 | const doc = bdb.documentsSync({ slug: slugWithoutAnchor })[0]; 56 | if (doc) { 57 | return { 58 | hName: "a", 59 | hProperties: { 60 | href: anchor ? `${doc.url()}#${anchor}` : doc.url(), 61 | }, 62 | hChildren: [ 63 | { 64 | type: "text", 65 | value: alias == null ? doc.frontmatter().title : alias, 66 | }, 67 | ], 68 | }; 69 | } else { 70 | return { 71 | hName: "span", 72 | hProperties: { 73 | class: "broken-link", 74 | title: `Can't resolve link to ${slug}`, 75 | }, 76 | hChildren: [{ type: "text", value: alias || slug }], 77 | }; 78 | } 79 | }, 80 | }, 81 | ], 82 | ], 83 | rehypePlugins: [ 84 | rehypeHeadingIds, 85 | [rehypeAutolinkHeadings, { behavior: "append" }], 86 | [ 87 | rehypeExternalLinks, 88 | { 89 | content: { type: "text", value: " ↗" }, // ⤴ 90 | contentProperties: { "aria-hidden": true, class: "no-select" }, 91 | }, 92 | ], 93 | rehypeKatex, 94 | ], 95 | }, 96 | vite: { 97 | ssr: { 98 | noExternal: ["katex"], 99 | }, 100 | optimizeDeps: { 101 | exclude: ["fsevents", "@node-rs", "@napi-rs"], 102 | }, 103 | }, 104 | }); 105 | -------------------------------------------------------------------------------- /src/components/preview.ts: -------------------------------------------------------------------------------- 1 | import { computePosition, autoPlacement, offset } from "@floating-ui/dom"; 2 | 3 | const tooltip = document.querySelector("#linkpreview") as HTMLElement; 4 | 5 | const elements = document.querySelectorAll( 6 | ".sl-markdown-content a, .timeline a" 7 | ) as NodeListOf; 8 | 9 | // response may arrive after cursor left the link 10 | let currentHref: string; 11 | // it is anoying that preview shows up before user ends mouse movement 12 | // if cursor stays long enough above the link - consider it as intentional 13 | let showPreviewTimer: NodeJS.Timeout | undefined; 14 | // if cursor moves out for a short period of time and comes back we should not hide preview 15 | // if cursor moves out from link to preview window we should we should not hide preview 16 | let hidePreviewTimer: NodeJS.Timeout | undefined; 17 | 18 | function hideLinkPreview() { 19 | clearTimeout(showPreviewTimer); 20 | if (hidePreviewTimer !== undefined) return; 21 | hidePreviewTimer = setTimeout(() => { 22 | currentHref = ""; 23 | tooltip.style.display = ""; 24 | hidePreviewTimer = undefined; 25 | }, 200); 26 | } 27 | 28 | function clearTimers() { 29 | clearTimeout(showPreviewTimer); 30 | clearTimeout(hidePreviewTimer); 31 | hidePreviewTimer = undefined; 32 | } 33 | 34 | async function showLinkPreview(e: MouseEvent | FocusEvent) { 35 | const start = `${window.location.protocol}//${window.location.host}`; 36 | const target = e.target as HTMLElement; 37 | const hrefRaw = (target?.closest("a")?.href || "") as 38 | | string 39 | | SVGAnimatedString; 40 | 41 | let href = ""; 42 | let local = false; 43 | let hash = ""; 44 | let svg = false; 45 | if (typeof hrefRaw === "string") { 46 | href = hrefRaw; 47 | hash = new URL(href).hash; 48 | local = href.startsWith(start); 49 | } else { 50 | // disabled for now 51 | href = hrefRaw.baseVal; 52 | hash = new URL(href, window.location.origin).hash; 53 | local = href.startsWith("/"); 54 | svg = true; 55 | } 56 | 57 | const hrefWithoutAnchor = href.replace(hash, ""); 58 | const locationWithoutAnchor = window.location.href.replace( 59 | window.location.hash, 60 | "" 61 | ); 62 | 63 | currentHref = href; 64 | if (hrefWithoutAnchor === locationWithoutAnchor || !local) { 65 | hideLinkPreview(); 66 | return; 67 | } 68 | clearTimers(); 69 | 70 | const text = await fetch(href).then((x) => x.text()); 71 | if (currentHref !== href) return; 72 | 73 | showPreviewTimer = setTimeout(() => { 74 | if (currentHref !== href) return; 75 | const doc = new DOMParser().parseFromString(text, "text/html"); 76 | const content = (doc.querySelector(".sl-markdown-content") as HTMLElement) 77 | ?.outerHTML; 78 | tooltip.innerHTML = svg 79 | ? `${doc.querySelector("h1")?.outerHTML}${content}` 80 | : content; 81 | tooltip.style.display = "block"; 82 | let offsetTop = 0; 83 | if (hash !== "") { 84 | const heading = tooltip.querySelector(hash) as HTMLElement | null; 85 | if (heading) offsetTop = heading.offsetTop; 86 | } 87 | tooltip.scroll({ top: offsetTop, behavior: "instant" }); 88 | 89 | computePosition(target, tooltip, { 90 | middleware: [offset(10), autoPlacement()], 91 | }).then(({ x, y }) => { 92 | Object.assign(tooltip.style, { 93 | left: `${x}px`, 94 | top: `${y}px`, 95 | }); 96 | }); 97 | }, 400); 98 | } 99 | 100 | tooltip.addEventListener("mouseenter", clearTimers); 101 | tooltip.addEventListener("mouseleave", hideLinkPreview); 102 | 103 | const events = [ 104 | ["mouseenter", showLinkPreview], 105 | ["mouseleave", hideLinkPreview], 106 | ["focus", showLinkPreview], 107 | ["blur", hideLinkPreview], 108 | ] as const; 109 | 110 | Array.from(elements).forEach((element) => { 111 | events.forEach(([event, listener]) => { 112 | element.addEventListener(event, listener); 113 | }); 114 | }); 115 | -------------------------------------------------------------------------------- /src/components/graphRenderer.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | /** 3 | * Graphology SVG Renderer 4 | * 5 | * Copy-paste from original package to fix some things in place 6 | */ 7 | import helpers from "graphology-svg/helpers"; 8 | import defaults from "graphology-svg/defaults"; 9 | // import line from "graphology-svg/components/edges/line"; 10 | // import circle from "graphology-svg/components/nodes/circle"; 11 | // import nodeLabelDefault from "graphology-svg/components/nodeLabels/default"; 12 | 13 | export const { DEFAULTS } = defaults; 14 | 15 | function nodeReducer(settings: any, node: any, attr: any) { 16 | return { 17 | ...defaults.DEFAULT_NODE_REDUCER(settings, node, attr), 18 | url: attr.url, 19 | id: node, 20 | }; 21 | } 22 | 23 | function drawCircle(_settings, data) { 24 | const circle = ``; 25 | if (!data.url) return circle; 26 | return `${circle}`; 29 | } 30 | 31 | function drawLabel(settings, data) { 32 | const label = `${helpers.escape(data.label)}`; 37 | if (!data.url) return ""; 38 | return ``; 41 | } 42 | 43 | const marker = ` 44 | 45 | 46 | 47 | `; 48 | 49 | function drawEdge(_settings, data, sourceData, targetData) { 50 | // return ``; 56 | 57 | const radius = 14; 58 | const length = Math.sqrt( 59 | Math.pow(sourceData.y - targetData.y, 2) + 60 | Math.pow(sourceData.x - targetData.x, 2) 61 | ); 62 | const coefficientX = (sourceData.x - targetData.x) / length; 63 | const coefficientY = (sourceData.y - targetData.y) / length; 64 | const arrowX = targetData.x + coefficientX * radius; 65 | const arrowY = targetData.y + coefficientY * radius; 66 | 67 | return ``; 70 | } 71 | 72 | const components = { 73 | nodes: { 74 | circle: drawCircle, 75 | }, 76 | edges: { 77 | line: drawEdge, 78 | }, 79 | nodeLabels: { 80 | default: drawLabel, 81 | }, 82 | }; 83 | 84 | export function renderer(graph: any, settings: any) { 85 | // Reducing nodes 86 | const nodeData = reduceNodes(graph, settings); 87 | 88 | // Drawing edges 89 | const edgesStrings = []; 90 | graph.forEachEdge(function (edge, attr, source, target) { 91 | // Reducing edge 92 | if (typeof settings.edges.reducer === "function") 93 | attr = settings.edges.reducer(settings, edge, attr); 94 | 95 | attr = defaults.DEFAULT_EDGE_REDUCER(settings, edge, attr); 96 | 97 | edgesStrings.push( 98 | components.edges[attr.type]( 99 | settings, 100 | attr, 101 | nodeData[source], 102 | nodeData[target] 103 | ) 104 | ); 105 | }); 106 | 107 | // Drawing nodes and labels 108 | // TODO: should we draw in size order to avoid weird overlaps? Should we run noverlap? 109 | const nodesStrings = []; 110 | const nodeLabelsStrings = []; 111 | let k; 112 | for (k in nodeData) { 113 | nodesStrings.push( 114 | components.nodes[nodeData[k].type](settings, nodeData[k]) 115 | ); 116 | nodeLabelsStrings.push( 117 | components.nodeLabels[nodeData[k].labelType](settings, nodeData[k]) 118 | ); 119 | } 120 | 121 | return ` 124 | ${marker} 125 | ${edgesStrings.join("")} 126 | ${nodesStrings.join("")} 127 | ${nodeLabelsStrings.join("")} 128 | `; 129 | } 130 | 131 | function reduceNodes(graph, settings) { 132 | const width = settings.width, 133 | height = settings.height; 134 | 135 | let xBarycenter = 0, 136 | yBarycenter = 0, 137 | totalWeight = 0; 138 | 139 | const data = {}; 140 | 141 | graph.forEachNode(function (node, attr) { 142 | // Applying user's reducing logic 143 | if (typeof settings.nodes.reducer === "function") 144 | attr = settings.nodes.reducer(settings, node, attr); 145 | 146 | attr = nodeReducer(settings, node, attr); 147 | data[node] = attr; 148 | 149 | // Computing rescaling items 150 | xBarycenter += attr.size * attr.x; 151 | yBarycenter += attr.size * attr.y; 152 | totalWeight += attr.size; 153 | }); 154 | 155 | xBarycenter /= totalWeight; 156 | yBarycenter /= totalWeight; 157 | 158 | let d, ratio, n; 159 | let dMax = -Infinity; 160 | 161 | let k; 162 | 163 | for (k in data) { 164 | n = data[k]; 165 | d = Math.pow(n.x - xBarycenter, 2) + Math.pow(n.y - yBarycenter, 2); 166 | 167 | if (d > dMax) dMax = d; 168 | } 169 | 170 | ratio = 171 | (Math.min(width, height) - 2 * settings.margin) / (2 * Math.sqrt(dMax)); 172 | 173 | for (k in data) { 174 | n = data[k]; 175 | 176 | n.x = width / 2 + (n.x - xBarycenter) * ratio; 177 | n.y = height / 2 + (n.y - yBarycenter) * ratio; 178 | 179 | n.size *= ratio; // TODO: keep? 180 | } 181 | 182 | return data; 183 | } 184 | -------------------------------------------------------------------------------- /references.txt: -------------------------------------------------------------------------------- 1 | Ahmed, M., Kaykobad, M., Chowdhury, R.A.: A new string matching algorithm. Int. J. Comput. Math. 80(7), 825–834 (2003), http://dx.doi.org/10.1080/0020716031000087113 2 | Al-Ssulami, A.M.: Hybrid string matching algorithm with a pivot. J. Information Science 41(1), 82–88 (2015), http://dx.doi.org/10.1177/0165551514555668 3 | Allauzen, C., Crochemore, M., Raffinot, M.: Factor oracle: A new structure for pattern matching. In: Pavelka, J., Tel, G., Bartosek, M. (eds.) SOFSEM ’99, Theory and Practice of Informatics, 26th Conference on Current Trends in Theory and Practice of Informatics, Milovy, Czech Republic, November 27 - December 4, 1999, Proceedings. Lecture Notes in Computer Science, vol. 1725, pp. 295–310. Springer (1999), http://dx.doi.org/10.1007/3-540-47849-3_18 4 | Allauzen, C., Raffinot, M.: Simple optimal string matching algorithm. In: Giancarlo, R., Sankoff, D. (eds.) Combinatorial Pattern Matching, 11th Annual Symposium, CPM 2000, Montreal, Canada, June 21-23, 2000, Proceedings. Lecture Notes in Computer Science, vol. 1848, pp. 364–374. Springer (2000), http://dx.doi.org/10.1007/3-540-45123-4_30 5 | Allauzen, C., Raffinot, M.: Simple optimal string matching algorithm. J. Algorithms 36(1), 102–116 (2000), http://dx.doi.org/10.1006/jagm.2000.1087 6 | Apostolico, A., Crochemore, M.: Optimal canonization of all substrings of a string. Inf. Comput. 95(1), 76–95 (1991), http://dx.doi.org/10.1016/0890-5401(91)90016-U 7 | Apostolico, A., Giancarlo, R.: The boyer-moore-galil string searching strategies revisited. SIAM J. Comput. 15(1), 98–105 (1986), http://dx.doi.org/10.1137/0215007 8 | Baeza-Yates, R.A., Gonnet, G.H.: A new approach to text searching. In: Belkin, N.J., van Rijsbergen, C.J. (eds.) SIGIR’89, 12th International Conference on Research and Development in Information Retrieval, Cambridge, Massachusetts, USA, June 25-28, 1989, Proceedings. pp. 168–175. ACM (1989), http://doi.acm.org/10.1145/75334.75352 9 | Baeza-Yates, R.A., Gonnet, G.H.: A new approach to text searching. Commun. ACM 35(10), 74–82 (1992), http://doi.acm.org/10.1145/135239.135243 10 | Belazzougui, D.: Worst case efficient single and multiple string matching in the RAM model. In: Iliopoulos, C.S., Smyth, W.F. (eds.) Combinatorial Algorithms - 21st International Workshop, IWOCA 2010, London, UK, July 26-28, 2010, Revised Selected Papers. Lecture Notes in Computer Science, vol. 6460, pp. 90–102. Springer (2010), http://dx.doi.org/10.1007/978-3-642-19222-7_10 11 | Belazzougui, D.: Worst-case efficient single and multiple string matching on packed texts in the word-ram model. J. Discrete Algorithms 14, 91–106 (2012), http://dx.doi.org/10.1016/j.jda.2011.12.011 12 | Belazzougui, D., Raffinot, M.: Average optimal string matching in packed strings. In: Spirakis, P.G., Serna, M.J. (eds.) Algorithms and Complexity, 8th International Conference, CIAC 2013, Barcelona, Spain, May 22-24, 2013. Proceedings. Lecture Notes in Computer Science, vol. 7878, pp. 37–48. Springer (2013), http://dx.doi.org/10.1007/978-3-642-38233-8_4 13 | Ben-Kiki, O., Bille, P., Breslauer, D., Gasieniec, L., Grossi, R., Weimann, O.: Optimal packed string matching. In: Chakraborty, S., Kumar, A. (eds.) IARCS Annual Conference on Foundations of Software Technology and Theoretical Computer Science, FSTTCS 2011, December 12-14, 2011, Mumbai, India. LIPIcs, Exact Online String Matching Bibliography 17 vol. 13, pp. 423–432. Schloss Dagstuhl - Leibniz-Zentrum fuer Informatik (2011), http://dx.doi.org/10.4230/LIPIcs.FSTTCS.2011.423 14 | Ben-Kiki, O., Bille, P., Breslauer, D., Gasieniec, L., Grossi, R., Weimann, O.: Towards optimal packed string matching. Theor. Comput. Sci. 525, 111–129 (2014), http://dx.doi.org/10.1016/j.tcs.2013.06.013 15 | Berry, T., Ravindran, S.: A fast string matching algorithm and experimental results. In: Holub, J., Sim´anek, M. (eds.) Proceedings of the Prague Stringology Club Workshop 1999, Prague, Czech Republic, July 8-9, 1999. pp. 16–28. Department of Computer Science and Engineering, Faculty of Electrical Engineering, Czech Technical University (1999), http://www.stringology.org/event/1999/p2.html 16 | Bille, P.: Fast searching in packed strings. In: Kucherov, G., Ukkonen, E. (eds.) Combinatorial Pattern Matching, 20th Annual Symposium, CPM 2009, Lille, France, June 22-24, 2009, Proceedings. Lecture Notes in Computer Science, vol. 5577, pp. 116–126. Springer (2009), http://dx.doi.org/10.1007/978-3-642-02441-2_11 17 | Bille, P.: Fast searching in packed strings. J. Discrete Algorithms 9(1), 49–56(2011), http://dx.doi.org/10.1016/j.jda.2010.09.003 18 | Boyer, R.S., Moore, J.S.: A fast string searching algorithm. Commun. ACM 20(10), 762–772 (1977), http://doi.acm.org/10.1145/359842.359859 19 | Cantone, D., Faro, S.: Searching for a substring with constant extra-space complexity. In: Ferragina, P., Grossi, R. (eds.) Proc. of Third International Conference on Fun with algorithms. pp. 118–131 (2004) 20 | Cantone, D., Cristofaro, S., Faro, S.: A space-efficient implementation of the goodsuffix heuristic. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2010, Prague, Czech Republic, August 30 - September 1, 2010. pp. 63–75. Prague Stringology Club, Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2010), http://www.stringology.org/event/2010/p06.html 21 | Cantone, D., Faro, S.: Fast-search: A new efficient variant of the boyer-moore string matching algorithm. In: Jansen, K., Margraf, M., Mastrolilli, M., Rolim, J.D.P. (eds.) Experimental and Efficient Algorithms, Second International Workshop, WEA 2003, Ascona, Switzerland, May 26-28, 2003, Proceedings. Lecture Notes in Computer Science, vol. 2647, pp. 47–58. Springer (2003), http://dx.doi.org/10.1007/3-540-44867-5_4 22 | Cantone, D., Faro, S.: Fast-search algorithms: New efficient variants of the boyer-moore pattern-matching algorithm. Journal of Automata, Languages and Combinatorics 10(5/6), 589–608 (2005) 23 | Cantone, D., Faro, S.: Improved and self-tuned occurrence heuristics. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2013, Prague, Czech Republic, September 2-4, 2013. pp. 92–106. Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2013), http://www.stringology.org/event/2013/p09.html 24 | Cantone, D., Faro, S.: Improved and self-tuned occurrence heuristics. J. Discrete Algorithms 28, 73–84 (2014), http://dx.doi.org/10.1016/j.jda.2014.07.006 25 | Cantone, D., Faro, S., Giaquinta, E.: Bit-(parallelism)2: Getting to the next level of parallelism. In: Boldi, P., Gargano, L. (eds.) Fun with Algorithms, 5th International Conference, FUN 2010, Ischia, Italy, June 2-4, 2010. Proceedings. 18 Simone Faro Lecture Notes in Computer Science, vol. 6099, pp. 166–177. Springer (2010), http://dx.doi.org/10.1007/978-3-642-13122-6_18 26 | Cantone, D., Faro, S., Giaquinta, E.: A compact representation of nondeterministic (suffix) automata for the bit-parallel approach. In: Amir, A., Parida, L. (eds.) Combinatorial Pattern Matching, 21st Annual Symposium, CPM 2010, New York, NY, USA, June 21-23, 2010. Proceedings. Lecture Notes in Computer Science, vol. 6129, pp. 288–298. Springer (2010), http://dx.doi.org/10.1007/978-3-642-13509-5_26 27 | Cantone, D., Faro, S., Giaquinta, E.: A compact representation of nondeterministic (suffix) automata for the bit-parallel approach. Inf. Comput. 213, 3–12 (2012), http://dx.doi.org/10.1016/j.ic.2011.03.006 28 | Charras, C., Lecroq, T., Pehoushek, J.D.: A very fast string matching algorithm for small alphabeths and long patterns (extended abstract). In: Farach-Colton [41], pp. 55–64, http://dx.doi.org/10.1007/BFb0030780 29 | Colussi, L.: Correctness and efficiency of the pattern matching algorithms. Inf. Comput. 95(2), 225–251 (1991), http://dx.doi.org/10.1016/0890-5401(91)90046-5 30 | Colussi, L.: Fastest pattern matching in strings. J. Algorithms 16(2), 163–189 (1994), http://dx.doi.org/10.1006/jagm.1994.1008 31 | Cormen, T.H., Leiserson, C.E., Rivest, R.L., Stein, C.: Introduction to Algorithms (3. ed.). MIT Press (2009), http://mitpress.mit.edu/books/introduction-algorithms 32 | Crochemore, M.: String-matching on ordered alphabets. Theor. Comput. Sci. 92(1), 33–47 (1992), http://dx.doi.org/10.1016/0304-3975(92)90134-2 33 | Crochemore, M., Czumaj, A., Gasieniec, L., Jarominek, S., Lecroq, T., Plandowski, W., Rytter, W.: Speeding up two string-matching algorithms. Algorithmica 12(4/5), 247–267 (1994), http://dx.doi.org/10.1007/BF01185427 34 | Crochemore, M., Perrin, D.: Two-way string matching. J. ACM 38(3), 651–675 (1991), http://doi.acm.org/10.1145/116825.116845 35 | Crochemore, M., Rytter, W.: Text Algorithms. Oxford University Press (1994), http://www-igm.univ-mlv.fr/~mac/REC/B1.html 36 | Deusdado, S.A.D., Carvalho, P.: Graspm: an efficient algorithm for exact pattern-matching in genomic sequences. IJBRA 5(4), 385–401 (2009), http://dx.doi.org/10.1504/IJBRA.2009.027510 37 | Durian, B., Chhabra, T., Ghuman, S.S., Hirvola, T., Peltola, H., Tarhio, J.: Improved two-way bit-parallel search. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2014, Prague, Czech Republic, September 1-3, 2014. pp. 71–83. Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2014), http://www.stringology.org/event/2014/p08.html 38 | Durian, B., Holub, J., Peltola, H., Tarhio, J.: Tuning BNDM with q-grams. In: Finocchi, I., Hershberger, J. (eds.) Proceedings of the Eleventh Workshop on Algorithm Engineering and Experiments, ALENEX 2009, New York, New York, USA, January 3, 2009. pp. 29–37. SIAM (2009), http://dx.doi.org/10.1137/1.9781611972894.3 39 | Durian, B., Peltola, H., Salmela, L., Tarhio, J.: Bit-parallel search algorithms for long patterns. In: Festa, P. (ed.) Experimental Algorithms, 9th International Symposium, SEA 2010, Ischia Island, Naples, Italy, May 20-22, 2010. Proceedings. Lecture Notes in Computer Science, vol. 6049, pp. 129–140. Springer (2010), http://dx.doi.org/10.1007/978-3-642-13193-6_12 Exact Online String Matching Bibliography 19 40 | Fan, H., Yao, N., Ma, H.: Fast variants of the backward-oracle-marching algorithm. In: Proceedings of the 2009 Fourth International Conference on Internet Computing for Science and Engineering. pp. 56–59. ICICSE ’09, IEEE Computer Society, Washington, DC, USA (2009), http://dx.doi.org/10.1109/ICICSE.2009.53 41 | Farach-Colton, M. (ed.): Combinatorial Pattern Matching, 9th Annual Symposium, CPM 98, Piscataway, New Jersey, USA, July 20-22, 1998, Proceedings, Lecture Notes in Computer Science, vol. 1448. Springer (1998) 42 | Faro, S.: Evaluation and improvement of fast algorithms for exact matching on genome sequences. In: 3rd Internanional Conference on Algorithms for Computational Biology. Lecture Notes in Computer Science, Springer (2016) 43 | Faro, S.: A very fast string matching algorithm based on condensed alphabets. In: Algorithmic Aspects in Information and Management - 10th International Conference, AAIM 2016. Proceedings. Lecture Notes in Computer Science, Springer (2016) 44 | Faro, S., Külekci, M.O.: Fast packed string matching for short patterns. In: Sanders, P., Zeh, N. (eds.) Proceedings of the 15th Meeting on Algorithm Engineering and Experiments, ALENEX 2013, New Orleans, Louisiana, USA, January 7, 2013. pp. 113–121. SIAM (2013), http://dx.doi.org/10.1137/1.9781611972931.10 45 | Faro, S., K¨ulekci, M.O.: Fast and flexible packed string matching. J. Discrete Algorithms 28, 61–72 (2014), http://dx.doi.org/10.1016/j.jda.2014.07.003 46 | Faro, S., Lecroq, T.: Efficient variants of the backward-oracle-matching algorithm. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2008, Prague, Czech Republic, September 1-3, 2008. pp. 146–160. Prague Stringology Club, Department of Computer Science and Engineering, Faculty of Electrical Engineering, Czech Technical University in Prague (2008), http://www.stringology.org/event/2008/p14.html 47 | Faro, S., Lecroq, T.: Efficient variants of the backward-oracle-matching algorithm. Int. J. Found. Comput. Sci. 20(6), 967–984 (2009), http://dx.doi.org/10.1142/S0129054109006991 48 | Faro, S., Lecroq, T.: The exact string matching problem: a comprehensive experimental evaluation. CoRR abs/1012.2547 (2010), http://arxiv.org/abs/1012.2547 49 | Faro, S., Lecroq, T.: Fast searching in biological sequences using multiple hash functions. In: 12th IEEE International Conference on Bioinformatics & Bioengineering, BIBE 2012, Larnaca, Cyprus, November 11-13, 2012. pp. 175–180. IEEE Computer Society (2012), http://dx.doi.org/10.1109/BIBE.2012.6399669 50 | Faro, S., Lecroq, T.: A fast suffix automata based algorithm for exact online string matching. In: Moreira, N., Reis, R. (eds.) Implementation and Application of Automata - 17th International Conference, CIAA 2012, Porto, Portugal, July 17-20, 2012. Proceedings. Lecture Notes in Computer Science, vol. 7381, pp. 149–158. Springer (2012), http://dx.doi.org/10.1007/978-3-642-31606-7_13 51 | Faro, S., Lecroq, T.: A multiple sliding windows approach to speed up string matching algorithms. In: Klasing, R. (ed.) Experimental Algorithms - 11th International Symposium, SEA 2012, Bordeaux, France, June 7-9, 2012. Proceedings. Lecture Notes in Computer Science, vol. 7276, pp. 172–183. Springer (2012), http://dx.doi.org/10.1007/978-3-642-30850-5_16 52 | Faro, S., Lecroq, T.: The exact online string matching problem: A review of the most recent results. ACM Comput. Surv. 45(2), 13 (2013), http://doi.acm.org/10.1145/2431211.243121220 Simone Faro 53 | Finkel, A., Jantzen, M. (eds.): STACS 92, 9th Annual Symposium on Theoretical Aspects of Computer Science, Cachan, France, February 13-15, 1992, Proceedings, Lecture Notes in Computer Science, vol. 577. Springer (1992) 54 | Franek, F., Jennings, C.G., Smyth, W.F.: A simple fast hybrid pattern-matching algorithm. In: Apostolico, A., Crochemore, M., Park, K. (eds.) Combinatorial Pattern Matching, 16th Annual Symposium, CPM 2005, Jeju Island, Korea, June 19-22, 2005, Proceedings. Lecture Notes in Computer Science, vol. 3537, pp. 288–297. Springer (2005), http://dx.doi.org/10.1007/11496656_25 55 | Franek, F., Jennings, C.G., Smyth, W.F.: A simple fast hybrid pattern-matching algorithm. J. Discrete Algorithms 5(4), 682–695 (2007), http://dx.doi.org/10.1016/j.jda.2006.11.004 56 | Fredriksson, K.: Faster string matching with super-alphabets. In: Laender, A.H.F., Oliveira, A.L. (eds.) String Processing and Information Retrieval, 9th International Symposium, SPIRE 2002, Lisbon, Portugal, September 11-13, 2002, Proceedings. Lecture Notes in Computer Science, vol. 2476, pp. 44–57. Springer (2002), http://dx.doi.org/10.1007/3-540-45735-6_5 57 | Fredriksson, K.: Succinct backward-dawg-matching. ACM Journal of Experimental Algorithmics 13 (2008), http://doi.acm.org/10.1145/1412228.1455263 58 | Fredriksson, K., Grabowski, S.: Practical and optimal string matching. In: Consens, M.P., Navarro, G. (eds.) String Processing and Information Retrieval, 12th International Conference, SPIRE 2005, Buenos Aires, Argentina, November 2-4, 2005, Proceedings. Lecture Notes in Computer Science, vol. 3772, pp. 376–387. Springer (2005), http://dx.doi.org/10.1007/11575832_42 59 | Galil, Z., Giancarlo, R.: On the exact complexity of string matching: Upper bounds. SIAM J. Comput. 21(3), 407–437 (1992), http://dx.doi.org/10.1137/0221028 60 | Galil, Z., Seiferas, J.I.: Time-space-optimal string matching. In: Proceedings of the 13th Annual ACM Symposium on Theory of Computing, May 11-13, 1981, Milwaukee, Wisconsin, USA. pp. 106–113. ACM (1981), http://doi.acm.org/10.1145/800076.802463 61 | Galil, Z., Seiferas, J.I.: Time-space-optimal string matching. J. Comput. Syst. Sci. 26(3), 280–294 (1983), http://dx.doi.org/10.1016/0022-0000(83)90002-8 62 | Hancart, C.: Analyse exacte et en moyenne d’algorithmes de recherche d’un motif dans un texte. Th`ese de doctorat, Universit´e Paris 7 (1993) 63 | He, L., Fang, B., Sui, J.: The wide window string matching algorithm. Theor. Comput. Sci. 332(1-3), 391–404 (2005), http://dx.doi.org/10.1016/j.tcs.2004.12.002 64 | Holub, J., Durian, B.: Talk: Fast variants of bit parallel approach to suffix automata. In: The Second Haifa Annual International Stringology Research Workshop of the Israeli Science Foundation, http://www.cri.haifa.ac.il/events/2005/string/presentations/Holub.pdf (2005) 65 | Horspool, R.N.: Practical fast searching in strings. Softw., Pract. Exper. 10(6), 501–506 (1980), http://dx.doi.org/10.1002/spe.4380100608 66 | Huang, Y., Ping, L., Pan, X., Cai, G.: A fast exact pattern matching algorithmfor biological sequences. In: Proceedings of the 2008 International Conference on BioMedical Engineering and Informatics, BMEI 2008, May 28-30, 2008, Sanya, Hainan, China - Volume 1. pp. 8–12. IEEE Computer Society (2008), http://dx.doi.org/10.1109/BMEI.2008.154 67 | Hudaib, A., Al-Khalid, R., Suleiman, D., Itriq, M., Al-Anani, A.: A fast pattern matching algorithm with two sliding windows (tsw). Journal of Computer Science 4(5), 393–401 (2008) Exact Online String Matching Bibliography 21 68 | Hudaib, A., Al-Khalid, R., Al-Anani, A., Itriq, M., Suleiman, D.: Four sliding windows pattern matching algorithm (fsw). Journal of Software Engineering and Applications 8, 154–165 (2015) 69 | Hume, A., Sunday, D.: Fast string searching. In: Proceedings of the Summer 1991 USENIX Conference, Nashville, TE, USA, June 1991. pp. 221–234. USENIX Association (1991) 70 | Hume, A., Sunday, D.: Fast string searching. Softw., Pract. Exper. 21(11), 1221–1248 (1991), http://dx.doi.org/10.1002/spe.4380211105 71 | Itriq, M., Hudaib, A., Al-Anani, A., Al-Khalid, R., Suleiman, D.: Enhanced two sliding windows algorithm for pattern matching (etsw). Journal of American Science 8, 60–616 (2012) 72 | Kalsi, P., Peltola, H., Tarhio, J.: Comparison of exact string matching algorithms for biological sequences. In: Elloumi, M., K¨ung, J., Linial, M., Murphy, R.F., Schneider, K., Toma, C. (eds.) Bioinformatics Research and Development, Second International Conference, BIRD 2008, Vienna, Austria, July 7-9, 2008, Proceedings. Communications in Computer and Information Science, vol. 13, pp. 417–426. Springer (2008), http://dx.doi.org/10.1007/978-3-540-70600-7_31 73 | Karp, R.M., Rabin, M.O.: Efficient randomized pattern-matching algorithms. IBM Journal of Research and Development 31(2), 249–260 (1987), http://dx.doi.org/10.1147/rd.312.0249 74 | Knuth, D.E., Jr., J.H.M., Pratt, V.R.: Fast pattern matching in strings. SIAM J. Comput. 6(2), 323–350 (1977), http://dx.doi.org/10.1137/0206024 75 | Külekci, M.O.: A method to overcome computer word size limitation in bit-parallel pattern matching. In: Hong, S., Nagamochi, H., Fukunaga, T. (eds.) Algorithms and Computation, 19th International Symposium, ISAAC 2008, Gold Coast, Australia, December 15-17, 2008. Proceedings. Lecture Notes in Computer Science, vol. 5369, pp. 496–506. Springer (2008), http://dx.doi.org/10.1007/978-3-540-92182-0_45 76 | Külekci, M.O.: Filter based fast matching of long patterns by using SIMD instructions. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2009, Prague, Czech Republic, August 31 - September 2, 2009. pp. 118–128. Prague Stringology Club, Department of Computer Science and Engineering, Faculty of Electrical Engineering, Czech Technical University in Prague (2009), http://www.stringology.org/event/2009/p11.html 77 | Lecroq, T.: A variation on the boyer-moore algorithm. Theor. Comput. Sci. 92(1), 119–144 (1992), http://dx.doi.org/10.1016/0304-3975(92)90139-7 78 | Lecroq, T.: Fast exact string matching algorithms. Inf. Process. Lett. 102(6), 229–235 (2007), http://dx.doi.org/10.1016/j.ipl.2007.01.002 79 | Liu, C., Wang, Y., Liu, D., Li, D.: Two improved single pattern matching algorithms. In: 16th International Conference on Artificial Reality and Telexistence, ICAT 2006, Hangzhou, China, November 29 - December 1, 2006, Workshops Proceedings. pp. 419–422. IEEE Computer Society (2006), http://dx.doi.org/10.1109/ICAT.2006.134 80 | Morris, Jr, J.H., Pratt, V.R.: A linear pattern-matching algorithm. Report 40, University of California, Berkeley (1970) 81 | Navarro, G.: Nr-grep: a fast and flexible pattern-matching tool. Softw., Pract. Exper. 31(13), 1265–1312 (2001), http://dx.doi.org/10.1002/spe.411 82 | Navarro, G., Raffinot, M.: A bit-parallel approach to suffix automata: Fast extended string matching. In: Farach-Colton [41], pp. 14–33, http://dx.doi.org/10.1007/BFb003077822 Simone Faro 83 | Navarro, G., Raffinot, M.: Fast and flexible string matching by combining bit-parallelism and suffix automata. ACM Journal of Experimental Algorithmics 5, 4 (2000), http://doi.acm.org/10.1145/351827.384246 84 | Nebel, M.E.: Fast string matching by using probabilities: On an optimal mismatch variant of horspool’s algorithm. Theor. Comput. Sci. 359(1-3), 329–343 (2006), http://dx.doi.org/10.1016/j.tcs.2006.05.028 85 | Peltola, H., Tarhio, J.: Alternative algorithms for bit-parallel string matching. In: Nascimento, M.A., de Moura, E.S., Oliveira, A.L. (eds.) String Processing and Information Retrieval, 10th International Symposium, SPIRE 2003, Manaus, Brazil, October 8-10, 2003, Proceedings. Lecture Notes in Computer Science, vol. 2857, pp. 80–94. Springer (2003), http://dx.doi.org/10.1007/978-3-540-39984-1_7 86 | Peltola, H., Tarhio, J.: Variations of forward-sbndm. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2011, Prague, Czech Republic, August 29-31, 2011. pp. 3–14. Prague Stringology Club, Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2011), http://www.stringology.org/event/2011/p02.html 87 | Peltola, H., Tarhio, J.: String matching with lookahead. Discrete Applied Mathematics 163, 352–360 (2014), http://dx.doi.org/10.1016/j.dam.2013.10.034 88 | Raita, T.: Tuning the boyer-moore-horspool string searching algorithm. Softw., Pract. Exper. 22(10), 879–884 (1992), http://dx.doi.org/10.1002/spe.4380221006 89 | Sahli, M., Shibuya, T.: Max-shift BM and max-shift horspool: Practical fast exact string matching algorithms. JIP 20(2), 419–425 (2012), http://dx.doi.org/10.2197/ipsjjip.20.419 90 | Senapati, K., Mal, S., Sahoo, G.: Rs-a fast pattern matching algorithm for biological sequences. International Journal of Engineering and Innovative Technology 1, 116–118 (2012) 91 | Sheik, S.S., Aggarwal, S.K., Poddar, A., Balakrishnan, N., Sekar, K.: A FAST pattern matching algorithm. Journal of Chemical Information and Modeling 44(4), 1251–1256 (2004), http://dx.doi.org/10.1021/ci030463z 92 | Simon, I.: String matching algorithms and automata. In: Karhum¨aki, J., Maurer, H.A., Rozenberg, G. (eds.) Results and Trends in Theoretical Computer Science, Colloquium in Honor of Arto Salomaa, Graz, Austria, June 10-11, 1994, Proceedings. Lecture Notes in Computer Science, vol. 812, pp. 386–395. Springer (1994), http://dx.doi.org/10.1007/3-540-58131-6_61 93 | Smith, P.D.: Experiments with a very fast substring search algorithm. Softw., Pract. Exper. 21(10), 1065–1074 (1991), http://dx.doi.org/10.1002/spe.4380211006 94 | Suleiman, D., Hudaib, A., Al-Anani, A., R., A.K., Itriq, M.: Ers-a algorithm for pattern matching. Middle East Journal of Scientific Research 15, 1067–1075 (2013) 95 | Suleiman, D., Itriq, M., Al-Anani, A., Al-Khalid, R., Hudaib, A.: Enhancing ersa algorithm for pattern matching (eers-a). Journal of Software Engineering and Applications 8, 143–153 (2015) 96 | Sunday, D.: A very fast substring search algorithm. Commun. ACM 33(8), 132–142 (1990), http://doi.acm.org/10.1145/79173.79184 97 | Sustik, M., Moore, J.: String searching over small alphabets. In: Technical Report TR-07-62. Department of Computer Sciences, University of Texas at Austin (2007) Exact Online String Matching Bibliography 23 98 | Watson, B.W., Kourie, D.G., Cleophas, L.G.: Quantum leap pattern matching. In: Holub, J., Zd´arek, J. (eds.) Proceedings of the Prague Stringology Conference 2015, Prague, Czech Republic, August 24-26, 2015. pp. 104–117. Department of Theoretical Computer Science, Faculty of Information Technology, Czech Technical University in Prague (2015), http://www.stringology.org/event/2015/p11.html 99 | Yao, A.C.: The complexity of pattern matching for a random string. SIAM J. Comput. 8(3), 368–387 (1979), http://dx.doi.org/10.1137/0208029 100 | Zhang, G., Zhu, E., Mao, L., Yin, M.: A bit-parallel exact string matching algorithm for small alphabet. In: Deng, X., Hopcroft, J.E., Xue, J. (eds.) Frontiers in Algorithmics, Third International Workshop, FAW 2009, Hefei, China, June 20-23, 2009. Proceedings. Lecture Notes in Computer Science, vol. 5598, pp. 336–345. Springer (2009), http://dx.doi.org/10.1007/978-3-642-02270-8_34 101 | Zhu, R.F., Takaoka, T.: On improving the average case of the Boyer-Moore string matching algorithm. J. Inform. Process. 10(3), 173–177 (1987) --------------------------------------------------------------------------------