【问题标题】:Array-based Trie Implementation. Non-null value in the child array基于数组的 Trie 实现。子数组中的非空值
【发布时间】:2016-12-06 19:34:38
【问题描述】:

我正在尝试从 http://www.programcreek.com/2014/05/leetcode-implement-trie-prefix-tree-java/ 了解基于数组的 Trie 实现(请参阅 Java 解决方案 2 - 通过使用数组提高性能)。

public void insert(String word) {
    TrieNode p = root;
    for(int i = 0; i < word.length(); i++) {
        char c = word.charAt(i);
        int index = c - 'a';
        if(p.arr[index] == null) {
            TrieNode temp = new TrieNode();
            p.arr[index] = temp;
            p = temp;
        } else {
            p = p.arr[index];
        }
    }
    p.isEnd = true;
}

我不确定 else 分支是否被执行过。我错过了什么?

更新 1

给定的单词只包含小写英文字母

【问题讨论】:

  • 旁注:int index = c-'a'; 完全错误。对于大写字母、数字、空格和许多标点字符,这会产生一个负数。
  • @Jim,请参阅更新 1
  • TrieNode的来源在哪里?
  • @Jim,你是什么意思?

标签: java data-structures trie


【解决方案1】:

第一次调用这个函数,else 分支确实不会执行。但是,随着 Trie 的填充,p.arr[index] 很可能不为空。

例如,调用insert("i") 将导致在root.arr['i' - 'a'] 添加一个新的TrieNode。第二次调用该函数,例如使用insert("it"),将导致检查p.arr[index] == null 返回false,因为第一次插入已经在根节点添加iTrieNode

您可以使用以下 main 函数进行测试(并在 else 分支中放置断点或 println 语句)

public static void main (String[] args)
{
    Trie t = new Trie();
    t.insert("i");
    t.insert("it");
}

【讨论】:

    【解决方案2】:

    在我看来,这很像一个错误。如果 c-'a'>26 则 p.arr[index] 不会为空,但会引发 ArrayIndexOutOfBounds 异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      相关资源
      最近更新 更多