Trie-在java中的实现
我知道有很多关于它的资料,但我有非常具体的问题。 我有一个包含邮政编码的文件,我必须使用这些编码创建trie数据结构。 我已经编写了我的实现,它是-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
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个字节