用 C# 实现的前缀树 - Trie
拜读了 Jeffery Zhao 的大作 后,有自己写一棵前缀树的冲动,于是花了一点时间,朴素地实现了。
[EDIT]发现这个实现有很多漏洞,隐藏了……真要看,点此展开
- DiryBoy
http://DiryBoy.cnblogs.com
http://DiryBoy.cnblogs.com
拜读了 Jeffery Zhao 的大作 后,有自己写一棵前缀树的冲动,于是花了一点时间,朴素地实现了。
[EDIT]发现这个实现有很多漏洞,隐藏了……真要看,点此展开
代码:
[折叠代码]using System.Collections.Generic; namespace DataStructure.Trees { public sealed class Trie<TKeyFragment, TValue> { private TrieNode<TKeyFragment, TValue> root; public Trie() { root = new TrieNode<TKeyFragment, TValue>(); } public Trie( TrieNode<TKeyFragment, TValue> root ) { this.root = root; } public bool Store( IEnumerable<TKeyFragment> key, TValue value ) { return root.Expand(key.GetEnumerator(), value); } public IEnumerable<TValue> LookFor( IEnumerable<TKeyFragment> key ) { return root.LookFor(key.GetEnumerator()); } } public class TrieNode<TKeyFragment, TValue> { protected Dictionary<TKeyFragment, TrieNode<TKeyFragment, TValue>> Table = new Dictionary<TKeyFragment, TrieNode<TKeyFragment, TValue>>(); protected List<TValue> ValueCollection = new List<TValue>(); protected internal virtual bool Expand( IEnumerator<TKeyFragment> keyEnumerator, TValue value ) { if ( keyEnumerator.MoveNext() ) { var nextfragment = keyEnumerator.Current; if ( !Table.ContainsKey(nextfragment) ) { Table.Add(nextfragment, new TrieNode<TKeyFragment, TValue>()); } return Table[nextfragment].Expand(keyEnumerator, value); } else { if ( !this.ValueCollection.Contains(value) ) { this.ValueCollection.Add(value); } return true; } } protected internal virtual IEnumerable<TValue> LookFor( IEnumerator<TKeyFragment> keyEnumerator ) { if ( keyEnumerator.MoveNext() ) { var nextfragment = keyEnumerator.Current; if ( !Table.ContainsKey(nextfragment) ) { return new List<TValue>(); } return Table[nextfragment].LookFor(keyEnumerator); } else { return ValueCollection; } } } }[折叠代码]
用的话键的类型要实现 IEnumerable<TKeyFragment>,用法简单:
[折叠代码]class Program { static void Main( string[] args ) { var mytrie = new Trie<char, string>(); mytrie.Store("I Love You", "Guys"); mytrie.Store("I Love You", "Cnblogs"); mytrie.Store("I Hate You", "Bad Guy"); mytrie.Store("I Hate You", "WTF"); mytrie.LookFor("I Love You").ToList().ForEach(str => Console.WriteLine(str)); mytrie.LookFor("I Hate You").ToList().ForEach(str => Console.WriteLine(str)); } }[折叠代码]
还没有想到怎么合并没有对应 Value 的中间节点,回去再想想。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述