2013-04-08 46 views

回答

1

添加

在根开始,搜索第一(或电流)的来信。如果找到该字母,则转到该节点并搜索下一个字母。如果未找到该字母,则搜索与当前字母匹配的单词,如果有相似的单词,则将当前字母添加为新节点,然后将该单词移到该单词下方,否则添加该单词。

注意:这将导致为搜索更优化的树,然后显示示例中显示的树。 (金刚和调整将在另一个“一”节点进行分组)

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

+0

@ user1747976为您添加到何处首先检索,然后将其添加。如果树中没有添加它。看到更新的答案。 – 2013-04-08 18:35:24

+0

如果将其限制为两个级别,则会显示问题中显示的树。 – 2013-04-08 18:48:07

+0

@ user1747976如果您强制执行两个级别并且只使用两个级别,则它将按照示例进行操作。在添加之前,您仍然需要搜索正确的节点以将其添加到(如果需要,可以创建它)。 – 2013-04-08 18:52:22

1

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

我读的规则,你应该遵循正确吗?

P.S.我认为使用全尺寸的阵列在空间上不会太浪费,它应该是非常快的地址

更新:@ user1747976,以及每个阵列需要约28 * 4或28 * 8位+ 12字节overhead。希望你使用压缩操作,所以它是每个阵列28 * 4 + 12 = 116bytes。现在,这取决于您是否想要提高内存效率或处理效率。为了提高内存效率,你可以使用某种类型的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]; 
    } 
} 

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

+0

@ user1747976,看到我更新的答案,确保你明白你在做什么,因为我几乎已经熟睡了,并且已经修复了两次 – akostadinov 2013-04-08 19:22:41

+0

'letterInd()'给出了你给一个字母的索引(即“a “它会返回1)。 'letter(wordInd,word)'会返回单词'word'中索引为'wordInd'的字母。它不是创建新的对象,而是创建新的数组或节点,如果你这样调用它的话。更新:我看到你有一个'Node'类,但它会更简单和更少的开销,没有一个单独的节点类,但使用一个简单的数组。否则,可能会将所有内容包装在课堂中,这取决于你想如何做。我刚刚给你一个例子循环添加一个单词。 – akostadinov 2013-04-08 19:36:29

+0

@ user1747976,对不起,更正了代码 – akostadinov 2013-04-08 20:13:33