2013-04-08 79 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