解决方案 »
- 新手,求助啊!Help,help!
- C# 一些默认按键的问题
- AjaxControlToolkit上传后 弹不出日期选择框
- 如何让窗口里控件的WM_NCHITTEST消息,转发给窗口,在线等!
- 在winform怎么加密的呢?
- C#序列化问题
- “/dormweb”应用程序中的服务器错误。对路径“C:\WINNT\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\dormweb\e6fe1f2c\
- C#多线程使程序变龟速
- 请问,C#中RichTextBox的应用。
- 我怎么覆盖派生类中的virtual成员函数?(up加分,详情请入内)
- 在LOAD事件里定义的线程为什么不能在按钮事件里结束?
- 【快来帮帮我】:关于Windows服务程序的属性问题
加上类似于KMP的失配回溯,就叫Trie图了
private const int alignConst = 3;
private const int charPtrAlignConst = 1;
申请3*10^7 string[]应该不会出问题,反正我这里可以。22b的问题应该不算大问题,我以前写的Trie用的是Dictionary,也没仔细用平摊算过,估计单节点占用更大,用List也许稍好一点点,不过Trie本就不是用来省内存的。
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);
}
}
期望是哈希比链表查找快一点。
你看看
我这个主要是实现Like搜索(前缀模糊搜索),最终结果只比C#本身的IndexOf快了一两百毫秒,却消耗了大量内存。纠结中。