Skip to content

perf(PrefixDictionary): Back with a char-keyed trie#316

Open
dimension-zero wants to merge 1 commit into
fsprojects:masterfrom
dimension-zero:pr/28-prefixdict-trie
Open

perf(PrefixDictionary): Back with a char-keyed trie#316
dimension-zero wants to merge 1 commit into
fsprojects:masterfrom
dimension-zero:pr/28-prefixdict-trie

Conversation

@dimension-zero
Copy link
Copy Markdown
Contributor

perf(PrefixDictionary): Back with a char-keyed trie

  • Utils.fs: New private PrefixTrieNode<'V> with Dictionary<char, ...>
    children and optional terminal (key, value). PrefixDictionary now
    builds a trie at construction and does O(L) lookups in TryGetPrefix
    rather than the previous O(N * L) linear scan over keys.
  • Public surface preserved exactly: Item, TryGetPrefix, Count, and the
    IEnumerable<string * 'Value> implementation behave identically.
    Longest-matching-prefix semantics preserved (the trie tracks the
    deepest terminal it visits along the way).
  • Empty-string keys (degenerate but possible) terminate at root and are
    returned for any input — matching the legacy linear-scan behaviour.

All 112 tests pass; this is a small win on schemas with many flags
(linear scan replaced with character-walk) and neutral on the small
schemas seen in tests.


* Utils.fs: New private PrefixTrieNode<'V> with Dictionary<char, ...>
  children and optional terminal (key, value). PrefixDictionary now
  builds a trie at construction and does O(L) lookups in TryGetPrefix
  rather than the previous O(N * L) linear scan over keys.
* Public surface preserved exactly: Item, TryGetPrefix, Count, and the
  IEnumerable<string * 'Value> implementation behave identically.
  Longest-matching-prefix semantics preserved (the trie tracks the
  deepest terminal it visits along the way).
* Empty-string keys (degenerate but possible) terminate at root and are
  returned for any input — matching the legacy linear-scan behaviour.

All 112 tests pass; this is a small win on schemas with many flags
(linear scan replaced with character-walk) and neutral on the small
schemas seen in tests.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant