Java:在Trie中存储子字符串

时间:2012-10-28 21:25:33

标签: java string recursion trie

我正在实现一个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。如果我不能清楚地解释它,我很抱歉 - 我有递归问题。感谢。

2 个答案:

答案 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中是否存在字符串,或者某些字符串是否为子字符串。