我正在实现一个trie,它将子字符串及其出现次数存储在字符串中。我的trie中的每个节点都有一个名为children的Map,它将存储主节点的所有子节点。
我的问题是,最终,这些子节点将拥有自己的子节点,我不知道我将如何从“地图内的地图中的地图......”中检索数据。
这是我到目前为止所拥有的:
private class TrieNode
{
private T data; //will hold the substring
int count; //how many occurrences of it were in the string
private Map<TrieNode, Integer> children; //will hold subnodes
private boolean isWord; //marks the end of a word if a substring is the last substring of a String
private TrieNode(T data)
{
this.data = data;
count = 1;
children = new HashMap<TrieNode, Integer>();
isWord = false;
}
}
如何从子节点检索数据,这些子节点本身可能还有其他子节点?
P.S。如果我不能清楚地解释它,我很抱歉 - 我有递归问题。感谢。
答案 0 :(得分:1)
我不明白为什么你要将一个字符串存储在一个名为T的类型中。这听起来像一个泛型类型,但你没有在类中声明它。
无论如何,我认为你需要一个Map<T, TrieNode>
来保持每个孩子用其子串键入。这样你就会再次进入另一个TrieNode
,这又有另一张相同类型的地图。
答案 1 :(得分:1)
你需要一些东西。首先,您需要Map<T, TrieNode>
,因为您正在将一段数据映射到子Trie。
其次,您需要知道如何将数据分成头部和尾部,以及如何在以后重新组合它们。在字符串的标准情况下,您使用子字符串和concationation。例如:
private TrieNode(String currChar, String rest) {
this.data = currChar;
this.children = new HashMap<String, TrieNode>();
if(rest.isEmpty()) {
this.isWord = true;
} else {
String head = rest.substring(0, 1);
String tail = rest.substring(1, rest.length());
this.children.add(head, new TrieNode(head, tail);
}
}
您的T
需要能够做类似的事情,或者首先使用Trie是没有意义的。
此外,您很少需要从Trie重新编译字符串。通常,您只是检查Trie中是否存在字符串,或者某些字符串是否为子字符串。