我的方法应该将相关的键/值对添加到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);
}
任何帮助将不胜感激!
答案 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
。因此,该值将以等于其键长的深度存储。