KTrie 2.3.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package KTrie --version 2.3.0
                    
NuGet\Install-Package KTrie -Version 2.3.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="KTrie" Version="2.3.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="KTrie" Version="2.3.0" />
                    
Directory.Packages.props
<PackageReference Include="KTrie" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add KTrie --version 2.3.0
                    
#r "nuget: KTrie, 2.3.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#addin nuget:?package=KTrie&version=2.3.0
                    
Install as a Cake Addin
#tool nuget:?package=KTrie&version=2.3.0
                    
Install as a Cake Tool

Trie

Trie (a.k.a. prefix tree) is an ordered tree data structure that is used to store an associative array where the keys are usually strings. All the descendants of a node have a common prefix of the string associated with that node, and the root is associated with the empty string.
Reference: Wikipedia – trie

CI Build Nuget

Advantages

  • Looking up keys is faster. Looking up a key of length key takes O(|key|) time
  • Looking up prefixes is faster. Looking up a prefix takes O(|prefix|) time
  • Removing takes O(|key|) time
Trie trie = ["abc", "abcd", "abx", "xyz"];

        root
         /\
        a  x
       /    \
      b      y
     / \      \
   [c]  [x]   [z]
   /
 [d]

 where [char] -- is end of word

The library provides two implementations of the trie data structure:

  • Trie : ICollection<string>, this is a set which stores unique string
  • TrieDictionary<TValue> : IDictionary<string, TValue>, this is a key-value-pair collection

Tutorial

TrieDictionary initialization:

// Initialization
TrieDictionary<int> trie = [];

// or using constructor with comparer
IEqualityComparer<char> comparer = ...; // specify the comparer
TrieDictionary<int> trieWithComparer = new(comparer);

Adding items to trie

trie.Add("key", 17);

The Add method throws ArgumentNullException if a value with the specified key already exists, however setting the Item property overwrites the old value. In other words, TrieDictionary<TValue> has the same behavior as Dictionary<TKey, TValue>.

The main advantage of trie is really fast prefix lookup. To find all items of TrieDictionary<TValue> which have keys with given prefix use StartsWith method which returns IEnumerable<KeyValuePair<string, TValue>>:

var result = trie.StartsWith("abc");

Another handy method is Matches(IReadOnlyList<Character> pattern)

var result = trie.Matches([Character.Any, 'c', Character.Any, Character.Any, 't']);

which will return all words that match this regex: ^.c.{2}t$, e.g.: octet, scout, scoot.

There are two overloads of the StartsWith method:

  • StartsWith(string value)
  • StartsWith(IReadOnlyList<Character> pattern)

Benchmark tests

For performance tests I used 58110 English words of length from 2 to 22 chars. The table below shows prefix lookup time comparing to the Linq Where and string.StartsWith. Number of prefixes: 10

Method Mean Error StdDev Allocated
Trie_StartsWith 1,663.334 us 25.0298 us 22.1883 us 782258 B
LinqSimple_StartsWith 17,899.727 us 178.2255 us 157.9923 us 675940 B
Linq_StartsWith 1,880.081 us 22.4351 us 20.9858 us 676893 B
Linq_DictionaryWithAllPrefixes 775.352 us 7.5212 us 6.6673 us 673053 B
Trie_Matches 5.389 us 0.0623 us 0.0583 us 9096 B
Trie_PatternStartsWith 10.924 us 0.2181 us 0.4455 us 14896 B
String_PatternMatching 116.097 us 2.0039 us 2.6057 us 416 B
String_PrefixPatternMatching 108.479 us 1.8731 us 1.7521 us 3432 B
Regex_PatternMatching 4,410.587 us 87.8454 us 90.2107 us 419 B
Regex_PrefixPatternMatching 4,309.215 us 54.2987 us 50.7910 us 3435 B

© Kirill Polishchuk

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net8.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on KTrie:

Repository Stars
BAndysc/WoWDatabaseEditor
Integrated development environment (IDE), an editor for Smart Scripts (SAI/smart_scripts) for TrinityCore based servers. Cmangos support work in progress. Featuring a 3D view built with OpenGL and custom ECS framework
Version Downloads Last Updated
3.0.0 64 7/10/2025
2.6.0 1,195 1/19/2025
2.5.0 3,904 4/29/2024
2.4.1 168 4/9/2024
2.4.0 249 3/30/2024
2.3.0 1,150 3/3/2024
1.3.0 9,682 2/23/2020