【问题标题】:trie building in java [duplicate]在java中构建trie [重复]
【发布时间】:2013-04-08 18:09:21
【问题描述】:

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

【问题讨论】:

    标签: java file insert


    【解决方案1】:

    在我看来,您正在尝试实现 trie。

    在这里寻找一个不错的 java 实现:http://www.cs.duke.edu/~ola/courses/cps108/fall96/joggle/trie/Trie.java

    【讨论】:

    • 谢谢大佬,我去看看
    • 非常有用,解决了我的问题!
    • 很高兴能帮上忙 ;)
    • 现在我明白了为什么 java 类通常是无用的......也就是说,总是有一种简单的方法可以找到代码来粘贴并完成它。如果是我,我不知道我是否会拒绝重用,但经验并没有真正通过这种方式获得。理解一些代码!= 编写代码。
    【解决方案2】:

    如果在叶子(实际单词)之前的树中只有两个级别,您可以简单地从包含 28 个元素的数组开始并将字母转换为索引(即 a==1、b==2 等.)。数组元素可以是一些包含完整单词的集合/列表。您可以懒惰地创建数组和列表(即创建根数组,但其他数组和单词列表为空值,然后在需要时/如果需要创建数组/列表)。

    我在阅读你应该正确遵守的规则吗?

    附:我认为使用每个全尺寸的数组不会太浪费空间,而且处理起来应该非常快

    更新:@user1747976,每个数组大约需要 28*4 或 28*8 位 + 12 字节 overhead。希望您使用压缩操作,因此每个数组是 28*4+12=116bytes。现在取决于您是想提高内存效率还是提高处理效率。为了提高内存效率,您可以使用某种哈希图而不是数组,但我不确定额外的开销是否会小于使用数组的开销。处理肯定会更糟。 您需要根据树部门的要求多次使用一些巧妙的循环。一些用于插入树的丑陋伪代码:

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

    可用于检索单词的类似循环。

    【讨论】:

    • @user1747976,看看我更新的答案,确保你明白你在做什么,因为我快睡着了,已经修复了两次
    • letterInd() 为您提供给字母的索引(即对于“a”,它将返回 1)。 letter(wordInd,word) 将返回单词word 中索引为wordInd 的字母。如果您这样称呼它,它不是创建新对象,而是创建新数组或节点。更新:我看到你有一个Node 类,但是没有一个单独的节点类而是使用一个简单的数组会更简单,开销也更少。否则,可以将所有内容包装在您的班级中,这取决于您希望如何做事。我只是给你一个示例循环来添加一个单词。
    • @user1747976,抱歉,已更正代码
    【解决方案3】:

    添加

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

    注意:这将产生一个比示例中显示的树更优化搜索的树。 (adamant 和 adapt 将被分组在另一个 'a' 节点下)

    更新:查看Trie的维基百科文章

    【讨论】:

    • @user1747976 你先搜索添加到哪里,再添加。如果树中没有任何内容,请添加它。查看更新的答案。
    • 如果您将其限制为两个级别,这将给出问题中显示的树。
    • @user1747976 如果您强制使用两个级别并且只使用两个级别,它将像示例中一样工作。在添加之前,您仍然需要搜索正确的节点以将其添加到(如果需要,创建它)。
    猜你喜欢
    • 1970-01-01
    • 2011-12-20
    • 2013-09-28
    • 2013-03-27
    • 2011-04-17
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2021-05-12
    相关资源
    最近更新 更多