Trie-在java中的实现

Trie-在java中的实现,java,trie,Java,Trie,我知道有很多关于它的资料,但我有非常具体的问题。 我有一个包含邮政编码的文件,我必须使用这些编码创建trie数据结构。 我已经编写了我的实现,它是- public class Trie{ TrieNode root = null; public void addWord(String zipCodeStr){ if(root==null){ root = new TrieNode(); } TrieNode current = root; fo

我知道有很多关于它的资料,但我有非常具体的问题。 我有一个包含邮政编码的文件,我必须使用这些编码创建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() {
    }

}
}
在这里,我没有存储任何值,因为位置提供了这些信息

问题-i)是否可以进一步即兴创作? ii)包含27000多个代码的原始文本文件大小约为190kb,我使用探查器检查了trie对象的大小,结果发现它要大得多。 这两种尺寸相关吗?trie大小是否应小于原始文本文件大小

谢谢,
Ouney

假设~9/10个节点是叶节点(不包含子节点),通过延迟初始化
子节点
数组,可以显著减少整个结构占用的空间:

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

trie节点本身占用24个字节,子节点占用104个字节。数字似乎还可以。在大多数情况下,在结构中组织数据会以空间换取访问速度(文件:更少的空间,更长的访问时间,trie:更多的空间,更快的访问)。是的,这确实是一个有用的建议。最深级别的trie节点指的是未被使用的阵列,它大大减少了阵列的实例。谢谢。我也知道原始文本文件的大小是无关的。如果我有27000个邮政编码,那么在UTF-8中,它将占用27000*6=162000字节(162KB),而Trie数据结构将根据分布情况容纳更多。@Ouney这是更好访问的折衷。在Java中,对象不能小于16个字节,那么大小将逐步增加8个字节:24,32,。。。在trie中,每个邮政编码需要~1.2个24字节的对象,因此~800Kb是您能达到的最佳值。@Sasha..您能详细说明关于24字节的最后评论吗?@Ouney header 8b+1 reference 8b+1 boolean 1b=17字节“四舍五入”到24字节。您可以使用
-XX:-UseCompressedOops
JVM属性将其压缩到16个字节