我为字典查找类构建了一个trie。它似乎工作得很好,除了trie非常大。似乎是大约80 MB,从我读过它应该只有5 MB大。我不知道是什么让trie气球达到80 MB,一旦它加载它运行速度令人难以置信。
Trie Class
public class Trie {
private TrieNode root = new TrieNode();
public const int ASCIIA = 97;
public TrieNode Insert(string word) {
char[] charArray = word.ToLower().ToCharArray();
TrieNode node = root;
foreach (char character in charArray) {
node = Insert(character, node);
}
node.IsEnd = true;
return root;
}
private TrieNode Insert(char character, TrieNode node) {
if (node.Contains(character)) {
return node.GetChild(character);
} else {
int number = System.Convert.ToByte(character) - TrieNode.ASCIIA;
TrieNode treeNode = new TrieNode();
node.nodes[number] = treeNode;
treeNode.Value = number;
return treeNode;
}
}
TrieNode类:
public class TrieNode {
public TrieNode[] nodes;
public bool IsEnd {get; set;}
public int Value {get; set;}
public const int ASCIIA = 97;
public const int ENGL = 26;
public TrieNode() {
nodes = new TrieNode[ENGL];
}
public bool Contains(char character) {
if (character == 0)
return false;
int number = System.Convert.ToByte(character) - ASCIIA;
if (number > ENGL)
return false;
return (nodes[number] != null);
}
public bool Contains(int character) {
if (character == 0)
return false;
return (nodes[character] != null);
}
public TrieNode GetChild(char character) {
int number = System.Convert.ToByte(character) - ASCIIA;
return nodes[number];
}
public TrieNode GetChild(int character) {
return nodes[character];
}
然后使用一本170,000字的字典来传递给特里,
string[] lines = fileTXT.Split("\n"[0]);
for (int i = 0; i < data.Length;i++) {
trieDict.Insert(data[i]);
}
答案 0 :(得分:2)
答案 1 :(得分:0)
你可以做的一件事是将TrieNode变成一个结构,然后避免在初始化后修改它...但是你可能还想做一次内存转储并检查内存,因为它可能没有占用你所需的空间think ...任务管理器中为进程报告的内存不是应用程序使用的内存 ,而是.NET运行时的应用程序内存保留。 / p>
答案 2 :(得分:0)