c#版字典树测试

ouc_ajax 2010-07-30 05:13:31
今天下午闲着没事,用c#写了个字典树,结果没有想到中间出了很多问题...
因为内容有点多,专门写到博客了...
字典树连接

希望大家觉得值得讨论的,仔细看下。帮我解惑!

谢谢了,如果分不够,我在开帖散分!
...全文
349 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级大笨狼 2011-05-08
  • 打赏
  • 举报
回复
http://www.cnblogs.com/dullwolf/archive/2011/04/15/2017479.html

我也写了一个,是利用的哈希来存储子节点。
期望是哈希比链表查找快一点。
你看看
我这个主要是实现Like搜索(前缀模糊搜索),最终结果只比C#本身的IndexOf快了一两百毫秒,却消耗了大量内存。纠结中。。。。
ouc_ajax 2010-08-02
  • 打赏
  • 举报
回复
哎... 好希望有个人能仔细看完,帮我解答下疑惑...
绿色夹克衫 2010-08-02
  • 打赏
  • 举报
回复
LZ一下子给了这么多分,受之有愧,给LZ提一些小建议吧!

TrieNode 最好加上

\\失配时回溯到的节点
public TrieNode FailNode { get; set; }

\\是否为叶子节点
public bool IsLeaf { get; set; }

附一段用BFS建立失配节点的程序,具体用途可以参看AC自动机

其他代码就不献丑了,LZ写的挺好的。

public void BuildFailNode()
{
Queue<TrieNode> bfsQueue = new Queue<TrieNode>();
bfsQueue.Enqueue(Root);
TrieNode node;

while (bfsQueue.Count > 0)
{
node = bfsQueue.Dequeue();

if (!node.ParentNode.Equals(Root) && node.ParentNode.FailNode.ChildNodes.ContainsKey(node.Key))
node.FailNode = node.ParentNode.FailNode.ChildNodes[node.Key];
else
node.FailNode = Root;

foreach (TrieNode child in node.ChildNodes.Values)
bfsQueue.Enqueue(child);
}
}
messi_yang 2010-07-31
  • 打赏
  • 举报
回复
先顶一下······
春天的气息 2010-07-31
  • 打赏
  • 举报
回复
呵呵,建议推广,有实例不呀?发到www.shilidata.com上啦,可以拿积分哦。
denbes 2010-07-31
  • 打赏
  • 举报
回复
Mark

看完再说.
llddyy123wq 2010-07-31
  • 打赏
  • 举报
回复
大概看了下,好多,说实话,对这个东东不太熟。需要以后仔细研究下。
xk1126 2010-07-31
  • 打赏
  • 举报
回复
瞅瞅!~~~~
ouc_ajax 2010-07-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sp1234 的回复:]

唉,最基本的数据结构概念,怎么来重复呢?随便搜个(第一个)结果吧:

http://blog.csdn.net/manesking/archive/2007/02/09/1505979.aspx

对于稍微大型一些的应用,它不会把数据放在树内,而只会放数据的引用(例如只是数据在磁盘块上的位置信息)。
[/Quote]

您好!其实我不是纠结于数据结构本身,而且我用的是字典树的一种演化. 我想解决的是我处理过程中遇到的一些疑惑,谢谢!
poloyzhang 2010-07-31
  • 打赏
  • 举报
回复
我喜欢分大方的,..............................
像我一样.
  • 打赏
  • 举报
回复
唉,最基本的数据结构概念,怎么来重复呢?随便搜个(第一个)结果吧:

http://blog.csdn.net/manesking/archive/2007/02/09/1505979.aspx

对于稍微大型一些的应用,它不会把数据放在树内,而只会放数据的引用(例如只是数据在磁盘块上的位置信息)。
绿色夹克衫 2010-07-30
  • 打赏
  • 举报
回复
占用内存的问题可能是LZ算的有点小问题!const


private const int alignConst = 3;
private const int charPtrAlignConst = 1;


申请3*10^7 string[]应该不会出问题,反正我这里可以。

22b的问题应该不算大问题,我以前写的Trie用的是Dictionary,也没仔细用平摊算过,估计单节点占用更大,用List也许稍好一点点,不过Trie本就不是用来省内存的。
mayonglong 2010-07-30
  • 打赏
  • 举报
回复
这个要顶~
Justin-Liu 2010-07-30
  • 打赏
  • 举报
回复
mark
hyblusea 2010-07-30
  • 打赏
  • 举报
回复
下周回来再仔细阅读 ..
绿色夹克衫 2010-07-30
  • 打赏
  • 举报
回复
加上类似于KMP的适配回溯,就叫Trie图了 =>
加上类似于KMP的失配回溯,就叫Trie图了
绿色夹克衫 2010-07-30
  • 打赏
  • 举报
回复
节省空间,或计数应该只是字典树比较偏门的应用(其实用后缀树可能效果更好),Trie树(加上类似于KMP的适配回溯,就叫Trie图了)主要功能还是在于多模式匹配下,能够提供线性的效率,可以用于搜索分词。
microsoftboss 2010-07-30
  • 打赏
  • 举报
回复
前来参战
Neil198 2010-07-30
  • 打赏
  • 举报
回复
嗯嗯,这么多分,我也标记下
兔子-顾问 2010-07-30
  • 打赏
  • 举报
回复
先标记一下。回头看。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧