基本结构:
字典树,即Trie树,又称单词查找树或键树,是一种树形结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
优点:
最大限度地减少无谓的字符串比较,查询效率比哈希表高。
基本性质:
1.结点本身不存完整单词。
2.从根到某一结点,路径上经过的字符连接起来,为该结点对应的字符串。
3.每个结点的所有子结点路径代表的字符都不相同。
核心思想:
Trie树的核心思想是空间换时间。
利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
代码实现:
#include<iostream>
#include<vector>
using namespace std;
class TrieNode{ //Trie树的结点
private:
int R;
vector<TrieNode*> links;
bool end;
public:
TrieNode(){
R=26;
links.resize(R,NULL);
end=false;
}
bool containsKey(char ch){
return links[ch-'a']!=NULL;
}
TrieNode* get(char ch){
return links[ch-'a'];
}
void put(char ch,TrieNode* node){
links[ch-'a']=node;
}
void setEnd(){
end=true;
}
bool isEnd(){
return end;
}
};
void insert(TrieNode* root,string word){ //把单词插入Trie树
TrieNode* node=root;
for(int i=0;i<word.size();i++){
if(!node->containsKey(word[i])){
node->put(word[i],new TrieNode());
}
node=node->get(word[i]);
}
node->setEnd();
}
TrieNode* search(TrieNode* root,string word){//单词word若在Trie树中返回叶子结点,否则返回NULL
TrieNode* node=root;
for(int i=0;i<word.size();i++){
if(node->containsKey(word[i])){
node=node->get(word[i]);
}else{
return NULL;
}
}
return node;
}
bool find(TrieNode* root,string word){//查看Trie树中是否存在单词word
TrieNode* node=search(root,word);
return node!=NULL&&node->isEnd();
}
bool startsWith(TrieNode* root,string word){//查看Trie树中是否存在前缀word
TrieNode* node=search(root,word);
return node!=NULL;
}
int main(){
TrieNode* root=new TrieNode();
insert(root,"apple");
insert(root,"orange");
if(find(root,"apple")){
cout<<"找到了单词apple"<<endl;
}
return 0;
}