[英]Trie tree struct declaration
所以我有這段代碼(不是我的),我一生都無法理解那些結構是什么樣的。 有人可以解釋一下嗎?
typedef struct trie_node trie_node_t;
struct trie_node
{
int value;
trie_node_t *children[ALPHABET_SIZE];
};
// trie ADT
typedef struct trie trie_t;
struct trie
{
trie_node_t *root;
int count;
};
第二個結構中的int count是用於計數放入樹中的所有單詞,但是我想知道每個單詞被放入其中的次數,除了修改代碼的其余部分外,我應該如何修改結構以實現該功能?
其余代碼: http : //pastebin.com/9zQuCBjb
我想您已經熟悉了trie的概念,您可以通過沿着單詞的字母在樹上行走(或爬行,以使用鏈接的代碼的單詞)並在每個節點處分支來找到單詞和單詞的前綴到您找到的字母。 每個節點有許多子節點。 如果使用不區分大小寫的拉丁字母,則為26。
該單詞被編碼在您到達的路徑中:
root->[f]->[i]->[s]->[h] --> "fish"
現在,您需要知道當前節點是否代表一個單詞。 "fish"
是一個詞,但"fis"
不是。 您不能使用節點是沒有子葉的事實,因為"fishbone"
可能在字典中。 這就是輸入value
目的:零表示當前節點不代表單詞,否則該值是當前單詞的基於1的索引。
創建新條目時,您只需向下爬取該Trie,就可以在創建過程中創建新節點,並使用當前字數將最后一個節點標記為值。 如果"fishbode"
已經在特里"fishbode"
中,並且添加了"fish"
,則不會創建新節點,而只會用新值標記"h"
節點。
trie
結構只是一個幫助,它包含了trie的根節點和一個計數。
如果要跟蹤事件的發生,請在節點上添加一個count
字段,並在設置value
時將其遞增。 (原始代碼不會檢查之前的值是否已經存在,並且會無條件添加單詞,從而覆蓋所有舊值。)
您還可以通過具有prefix_count
字段並在插入鍵時通過節點時增加該值,來對當前節點prefix_count
前綴開頭的所有單詞進行計數。
當您想要檢索發生事件時,您將必須遍歷所有子樹。
嘗試對於自動擴展用戶輸入的首字母或T9樣式的鍵入系統中的單詞很有用,但是它們非常貪婪。 如果您只想計算單詞的出現次數(而沒有利用trie的好處),則可以使用單個要計數的單詞哈希表來實現這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.