我知道有很多关于它的材料,但我有非常具体的问题。 我有一个包含邮政编码的文件,我必须使用这些代码创建trie数据结构。 我写了我的实现 -
public class Trie{
TrieNode root = null;
public void addWord(String zipCodeStr){
if(root==null){
root = new TrieNode();
}
TrieNode current = root;
for(char c : zipCodeStr.toCharArray()){
if(current.childern[Character.getNumericValue(c)]==null){
current.childern[Character.getNumericValue(c)] = new TrieNode();
}
current = current.childern[Character.getNumericValue(c)];
}
current.isWord = true;
}
public boolean exists(String zipCodeStr){
boolean result = true;
TrieNode current = root;
for(char c : zipCodeStr.toCharArray()){
if(current.childern[Character.getNumericValue(c)]==null){
result = false;
break;
}
current = current.childern[Character.getNumericValue(c)];
}
if(result && current.isWord){
result = true;
}else{
result = false;
}
return result;
}
private static class TrieNode{
TrieNode[] childern = new TrieNode[10];
boolean isWord = false;
public TrieNode() {
}
}
}
这里,我没有存储任何值,因为position提供了这些信息。
问题 - i)可以进一步即兴创作吗? ii)包含27000+代码的原始文本文件大小约为190kb,我使用分析器检查了trie对象的大小。 这两个尺寸有关吗? trie size是否应小于原始文本文件大小?
谢谢, Ouney
答案 0 :(得分:3)
假设~9 / 10节点是叶子(不包含子节点),您可以通过children
数组的延迟初始化显着减少整个结构占用的空间:
private static class TrieNode {
TrieNode[] children = null;
boolean isWord = false;
}
现在,只有在实际需要时才需要创建新数组:
public void addWord(String zipCodeStr) {
if (root == null){
root = new TrieNode();
}
TrieNode current = root;
for (char c : zipCodeStr.toCharArray()) {
if (current.children == null) {
current.children = new TrieNode[10];
}
if (current.children[Character.getNumericValue(c)] == null) {
current.children[Character.getNumericValue(c)] = new TrieNode();
}
current = current.children[Character.getNumericValue(c)];
}
current.isWord = true;
}