博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字典树简单知识及类实现
阅读量:6842 次
发布时间:2019-06-26

本文共 2852 字,大约阅读时间需要 9 分钟。

什么是trie树?

◇ trie树是一种用于高速检索的多叉树结构。

◇ 和二叉查找树不同,在trie树中,每一个结点上并不是存储一个元素。

◇ trie树把要查找的关键词看作一个字符序列。并依据构成关键词字符的先后顺序构造用于检索的树结构。

◇在trie树上进行检索类似于查阅英语词典。

一棵m度的trie树或者为空。或者由m棵m度的trie树构成。

比如。电子英文词典,为了方便用户高速检索英语单词,能够建立一棵trie树。比如词典由以下的单词构成:a、b、c、aa、ab、ac、ba、ca、aba、abc、baa、bab、bac、cab、abba、baba、caba、abaca、caaba

在trie树上进行查找
比如在上面的trie树中查找单词
aba
(1)在trie树上进行检索总是始于根结点。
(2)取得要查找关键词的第一个字母(比如
a )。并依据该字母选择相应的子树并转到该子树继续进行检索。
(3)在相应的子树上,取得要查找关键词的第二个字母(比如
b),并进一步选择相应的子树进行检索。

(4) ...
(5)在某个结点处。关键词的全部字母已被取出。则读取附在该结点上的信息,即完毕查找。

有关Trie树:
在trie树中查找一个keyword的时间和树中包括的结点数无关。而取决于组成keyword的字符数。而二叉查找树的查找时间和树中的结点数有关
O(log2
n)。
假设要查找的keyword能够分解成字符序列且不是非常长。利用trie树查找速度优于二叉查找树。如:
若keyword长度最大是5。则利用trie树,利用5次比較能够从265=11881376个可能的keyword中检索出指定的keyword。而利用二叉查找树至少要进行log2265=23.5次比較。

Trie的类实现及解析:
#include 
#include
#include
#include
#define MAXN 10010#define RST(N)memset(N, 0, sizeof(N))using namespace std;const int char_num = 26;class Trie {public: Trie(); int trie_search(const char* word, char* entry) const; int insert(const char* word, char* entry); int remove(const char* word, char* entry);protected: struct Trie_node { char *data; Trie_node *branch[char_num]; //指向各個子樹的指針 Trie_node(); }; Trie_node *root;};Trie::Trie() : root(NULL) {};Trie::Trie_node::Trie_node(){ data = NULL; for(int i=0; i
='a' && *word<='z') char_code = *word-'a'; else if(*word>='A' && *word<='Z') char_code = *word-'A'; else return 0; //不合法單詞 location = location->branch[char_code]; position++, word++; } if(location != NULL && location->data != NULL) { strcpy(entry, location->data); return 1; } return 0;}int Trie::insert(const char *word, char *entry) //插入{ int result = 1, position = 0; if(root == NULL) root = new Trie_node; char char_code; Trie_node *location = root; while(location != NULL && *word != 0) { if(*word>='a' && *word<='z') char_code = *word-'a'; else if(*word>='A' && *word<='Z') char_code = *word-'A'; else return 0; //不合法單詞 if(location->branch[char_code] == NULL) location->branch[char_code] = new Trie_node; location = location->branch[char_code]; position++, word++; } if(location->data != NULL) result = 0; else { location->data = new char(strlen(entry)+1); strcpy(location->data, entry); } return result;}int main(){ Trie t; char entry[100]; t.insert("a", "DET"); t.insert("abacus","NOUN"); t.insert("abalone","NOUN"); t.insert("abandon","VERB"); t.insert("abandoned","ADJ"); t.insert("abashed","ADJ"); t.insert("abate","VERB"); t.insert("this", "PRON"); if (t.trie_search("this", entry)) cout<<"'this' was found. pos: "<
<

你可能感兴趣的文章
[华为机试真题]72.操作系统任务调度问题
查看>>
解决scrollView上subView下移20point问题的一种方式
查看>>
前端面试之关于HTTP协议
查看>>
利用 Matplotlib 绘制数据图形(二)
查看>>
iOS概念攻坚之路(二):Runtime
查看>>
关于前端请求发送时间时而长时而短问题(stalled a lot)
查看>>
Python 工匠:编写条件分支代码的技巧
查看>>
记一次前端面试经历
查看>>
带你探索JUnit 5.4
查看>>
<暗时间> 时间, 不在于你拥有多少, 而在于你怎样使用
查看>>
单例 - iOS
查看>>
戛纳电影节百花齐放,中国明星衣着品味紧跟时尚前沿
查看>>
mysql 存储emoji表情
查看>>
10年测试总监经验分享,你与优秀工程师的距离!
查看>>
2019年在哪里找好的高层次人才扶持政策?
查看>>
解决代码报红:Cannot resolve symbol 'xxx'
查看>>
第71节:Java中HTTP和Servlet
查看>>
Linux开源CommunityBridge平台 提供资金、安全以及人员三项关键
查看>>
Python爬虫入门教程 5-100 27270图片爬取
查看>>
Day1:html和css
查看>>