使用尝试递归地在哈希图中查找单词

时间:2019-04-04 22:17:52

标签: java hashmap trie

我的方法应该将相关的键/值对添加到Trie,如果键已经在Trie中,则应该更新值。但是我不太确定我在做什么错,这是我第一次使用尝试。 因此,我目前正在研究put方法,并且具有以下内容:

public void put(TrieMapNode current, String curKey, String value){
if(current.getChildren().containsKey(curKey))
      value = current.get(key);
      curKey =value;

  put(current.getChildren().get(curKey), curKey, value);

}

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

在当前的实现中,您不会从trie的优点中受益。这是因为在根节点上,每个遇到的字符串都有一个孩子。
那不是特里树的建立方式。特里树的每个节点每个字符(构成字符串的元素)最多可以有一个孩子。
因此,您的方法应类似于以下内容:

inputDatabase(entries)
entries.clear()

您所做的主要错误是在插入或更新Trie时要整体考虑密钥。这将导致根节点为地图中的每个键有一个子节点(因此有大量的子代),但是深度非常有限(根节点及其子代就是这样)。

在我建议的实现中,一个节点的每个可能字符(有界数26、52,总有一个有界数)有一个孩子。
而且它的深度不限于一个,因为正如您在public void put(TrieMapNode current, String key, String value, int depth){ if (depth == key.length()){ current.value = value; } else { char curChar = key.charAt(depth); if(!current.getChildren().containsKey(curChar)){ TrieMapNode newNode = new TrieMapNode(); current.getChildren().put(curChar, newNode); } put(current.getChildren().get(curChar), curKey, value, depth + 1); } 块中看到的那样,如果要寻找的节点不存在,我们会创建一个节点(开始时只有一个根节点,因此您需要以计划创建新节点的情况),我们还对当前节点的子节点递归调用else。因此,该值将以等于其键长的深度存储。