Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的trie建筑_Java_File_Insert - Fatal编程技术网

java中的trie建筑

java中的trie建筑,java,file,insert,Java,File,Insert,如何从文件构造树?我希望能够从文件中读取它们,然后添加到适当的级别添加 从根开始,搜索第一个(或当前)字母。如果找到该字母,则移动到该节点并搜索下一个字母。如果未找到该字母,请搜索与当前字母匹配的单词,如果存在类似的单词,则将当前字母添加为新节点,并将两个单词移动到该节点下,否则添加该单词 注意:这将生成一个比示例中显示的树更适合搜索的树。(adamant和adapt将分组在另一个“a”节点下) 更新:请查看维基百科文章中的如果在leafs(实际单词)之前的树中只有两个级别,您可以简单地从包含2

如何从文件构造树?我希望能够从文件中读取它们,然后添加到适当的级别

添加

从根开始,搜索第一个(或当前)字母。如果找到该字母,则移动到该节点并搜索下一个字母。如果未找到该字母,请搜索与当前字母匹配的单词,如果存在类似的单词,则将当前字母添加为新节点,并将两个单词移动到该节点下,否则添加该单词

注意:这将生成一个比示例中显示的树更适合搜索的树。(adamant和adapt将分组在另一个“a”节点下)


更新:请查看维基百科文章中的如果在leafs(实际单词)之前的树中只有两个级别,您可以简单地从包含28个元素的数组开始,并将字母转换为索引(即a==1,b==2,等等)。数组的元素可以是包含完整单词的集合/列表。您可以惰性地创建数组和列表(即,创建根数组,但其他数组和单词列表为空,然后在需要时创建数组/列表)

我是否阅读了你应该正确遵守的规则

另外,我认为使用全尺寸阵列不会对空间造成太大浪费,而且应该很快解决

更新:@user1747976,每个数组大约需要28*4或28*8位+12字节。希望您使用压缩的ops,因此每个数组的大小为28*4+12=116字节。现在,这取决于您是希望提高内存效率还是处理效率。为了节省内存,您可以使用某种hashmap来代替数组,但我不确定额外的开销是否会比使用数组时少。不过,处理过程肯定会更糟。 您需要根据需求多次使用一些巧妙的循环。插入到树中的一些丑陋的伪代码:

root=new Object[28];
word="something";
pos = root;
wordInd=1;
for (int i=1; i<=TREE_DEPTH ; i++) {
   targetpos = letterInd(letter(wordInd,word));
   if (i==TREE_DEPTH) {
      if (pos[targetpos] == null) pos[targetpos] = new HashSet<String>();
      (Set) pos[targetpos].add(word);
      break;
   } else {
      if (pos[targetpos] == null) pos[targetpos] = new Object[28];
      wordInd++;
      pos = pos[targetpos];
   }
}
root=新对象[28];
word=“某物”;
pos=根;
wordInd=1;

对于(inti=1;i,在我看来,您正在尝试实现trie


请在此处查找java中的一个很好的实现:

@user1747976您首先搜索添加它的位置,然后添加它。如果树中没有任何内容,请添加它。请参阅更新的答案。如果您将它限制为两个级别,这将生成问题中所示的树。@user1747976如果强制使用两个级别,并且只使用两个级别,它将与示例中的一样工作。您在添加之前,仍然需要搜索要添加到的正确节点(如果需要,请创建该节点)。@user1747976,请查看我的更新答案,确保您了解自己在做什么,因为我几乎要睡觉了,并且已经两次将其修复。
lettind()
为您提供了一个字母的索引(即,对于“a”,它将返回1).
字母(wordInd,word)
将返回单词
word
中带有索引的字母
wordInd
。它不是创建新对象,而是创建一个新数组或节点(如果您这样称呼它)。更新:我看到您有一个
节点
类,但如果没有单独的节点类,而使用一个简单的数组,则会更简单,开销更小。否则是可能的在类中封装所有内容,取决于您希望如何操作。我刚才给了您一个示例循环来添加一个单词。@user1747976,对不起,更正了代码谢谢,我将查看它非常有用,解决了我的问题!我很高兴我能帮上忙;)现在我明白了为什么java类通常是无用的。。i、 总是有一种简单的方法可以找到只需粘贴的代码,并完成它。我不知道如果是我的话,我是否会抵制重用,但这样做并不能真正获得经验。了解一些代码!=编写代码。