我有一个用例,我想纠正单词。 我有一套正确和错误的单词[拼写错误]。 我用所有的话来填充特里。 我有每个单词的正确和错误版本。
如果我得到的话是" a"为了纠正,
- 我在trie中搜索它。如果有这个词,我想将这个词与这个词的正确版本联系起来。
解决方案: 我可以在trie中错误单词的最后一个节点上设置正确的单词[" a1"]。并且可以将其解析为" a1"
但我必须在最后一个节点存储每个单词的正确版本,这将增加内存占用量。 因为我已将所有单词加载到trie中[正确/不正确]。 有没有什么方法可以在正确和不正确的单词之间建立关联,而无需再将最后一个节点中的整个单词存储为值? 任何指针?
public class TrieNode<T> {
private Map<Character, TrieNode<T>> childs;
private boolean complete;
private T value;
....
}
答案 0 :(得分:1)
你可以使用一个字典。在C#中,那将是:
Dictionary<string, string> MisspellingsLookup = new Dictionary<string, int>();
关键是拼写错误,值是正确的拼写。
现在,有些词通常以多种方式拼写错误。例如,“场合”通常拼错为“ocassion”或“occassion”如果要减少多个拼写错误所使用的内存,可以在构造期间使用临时字典。每当你添加拼写错误时,你都会在好词汇词典中查找正确的拼写,如果它已经存在,那么你就可以使用该值。因此,您所做的只是存储对现有单词的引用,而不是创建新的字符串。这是一个例子:
Dictionary<string, string> GoodWords = new Dictionary<string, int>();
Dictionary<string, string> Misspellings = new Dictionary<string, string>();
void AddMisspelling(string misspelled, string correct)
{
string goodWord;
if (!GoodWords.TryGetValue(correct, out goodWord))
{
goodWord = correct;
GoodWords.Add(correct, correct);
}
// Always use goodWord here, so you're not creating duplicate strings.
Misspellings.Add(misspelled, goodWord);
}
完成单词添加后,您可以清除GoodWords
字典以节省空间:
GoodWords = null;
我在这里推荐一本字典,因为它几乎肯定会使用更少的内存,而查找是O(1)而不是O(字长)。