字典樹
字典樹,又稱單詞查詢樹,trie樹,是一種樹形結構,雜湊表的乙個變種。用於統計,排序和儲存大量的字串(也可以儲存其
的)。優點就是利用公共的字首來節約儲存空間。在這舉個簡單的例子:比如說我們想儲存3個單詞,nyist、nyistacm、nyisttc。如果只是
單純的按照以前的字元陣列儲存的思路來儲存的話,那麼我們需要定義三個字串陣列。但是如果我們用字典樹的話,只需要定義
乙個樹就可以了。在這裡我們就可以看到字典樹的優勢了。
基本的操作
[cpp]view plain
copy
print?
struct node
};
struct node
};
next是表示每層有多少種類的數,如果只是小寫字母,則26即可,若改為大小寫字母,則是52,若再加上數字,則是62了,這裡根
據題意來確定。
cnt可以表示乙個字典樹到此有多少相同字首的數目,這裡根據需要應當學會自由變化。
構建trie樹的基本演算法也很簡單,無非是逐一把每則單詞的每個字母插入trie。插入前先看字首是否存在。如果存在,就共享,否則
建立對應的節點和邊。比如要插入單詞add(已經插入了單詞「ad」),就有下面幾步:
考察字首"a",發現邊a已經存在。於是順著邊a走到節點a。
考察剩下的字串"dd"的字首"d",發現從節點a出發,已經有邊d存在。於是順著邊d走到節點ad
考察最後乙個字元"d",這下從節點ad出發沒有邊d了,於是建立節點ad的子節點add,並把邊ad->add標記為d。
[cpp]view plain
copy
print?
void buildtrie(char *s)
p=p->next[s[i]-'a'];
p->cnt++;
}
}
void buildtrie(char *s)
p=p->next[s[i]-'a'];
p->cnt++;
} }
(1)每次從根結點開始進行搜尋;
(4)迭代剛才過程。。。
(5)直到在某個結點處:
[cpp]view plain
copy
print?
void findtrie(char *s)
p=p->next[s[i]-'a'];
}
printf("%d\n",p->cnt);
}
void findtrie(char *s)
p=p->next[s[i]-'a'];
} printf("%d\n",p->cnt);
}
有些題目,資料比較大,需要查詢完之後釋放記憶體(比如:hdu1671 phone list)
遞迴釋放記憶體:
[cpp]view plain
copy
print?
void del(node *root)
字典樹模板
字典樹,又稱單詞查詢樹,trie樹,是一種樹形結構,典型應用是用於統計,排序和儲存大量的字串,所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來節約儲存空間,最大限度的減少無謂的字串比較,查詢效率比雜湊表高。字典樹的應用 字串的快速檢索 雜湊最長公共字首 include usi...
字典樹模板
package template public class triemod trie root new trie for string s str if find root,asdf else public static void insert final trie root,string str ...
字典樹模板
今天ac了兩題trie tree的題目,感覺trie的性質真的是相當的好,而且實現比較簡單。它使在字串集合中查詢某個字串的操作的複雜度降到最大只需o n 其中n為字串的長度。trie是典型的將時間置換為空間的演算法,好在acm中一般對空間的要求很寬鬆。include includeusing nam...