Trie - 在java中实现

时间:2015-05-05 17:58:15

标签: java trie

我知道有很多关于它的材料,但我有非常具体的问题。 我有一个包含邮政编码的文件,我必须使用这些代码创建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对象的大小。 Profiler output 这两个尺寸有关吗? trie size是否应小于原始文本文件大小?

谢谢, Ouney

1 个答案:

答案 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;
}