首页 > 其他 > 详细

【经典数据结构】Trie

时间:2015-03-13 17:57:29      阅读:379      评论:0      收藏:0      [点我收藏+]

  在计算机科学中,trie,又称前缀树字典树,是一种有种树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。

以下几个博客的讲解很详细:

1. http://blog.csdn.net/hackbuteer1/article/details/7964147

2. http://blog.csdn.net/v_july_v/article/details/6897097

3. http://blog.csdn.net/luxiaoxun/article/details/7937589

4. 《王道程序员求职宝典》 P276

 

使用范围:

  1. 词频统计 2.前缀匹配 3.全词匹配

 

 

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 class Trie{
 6 public:
 7     Trie();
 8     ~Trie();
 9     void Insert(const string &s);
10     bool Search(const string &s) const;
11 private:
12     struct TrieNode{
13             int count; //单词出现的次数
14             TrieNode *next[26]; 
15             bool exist;
16 
17             TrieNode(): count(0), exist(false) {
18                 memset(next, NULL, sizeof(next));
19             }
20     };
21 
22     TrieNode *root_;
23 
24     void MakeEmpty(TrieNode *root);
25 };
26 
27 Trie::Trie() {
28     root_ = new TrieNode();
29 }
30 
31 Trie::~Trie() {
32     MakeEmpty(root_);
33 }
34 
35 void Trie::Insert(const string &s) {
36     int len = s.size();
37     TrieNode *position = root_;
38     for (int i =0; i < len; ++i) { //不存在建立一个节点
39         if (position->next[s[i] - a] == NULL) {
40             position->next[s[i] -a] = new TrieNode();
41         }
42         position = position->next[s[i] - a]; //没插入一步,相当于一个新串经过,指针要向下移动
43     }
44 
45     position->count++;
46     position->exist = true;
47 }
48 
49 bool Trie::Search(const string &s) const {
50     if (root_ == NULL) return false;
51 
52     int len = s.size();
53     TrieNode *location = root_;
54     for (int i = 0; i < len; ++i) {
55         if (location->next[s[i] - a] == NULL) {
56             return false;
57         } 
58         location = location->next[s[i] - a];
59     }
60 
61     return location->exist;
62 }
63 
64 void Trie::MakeEmpty(TrieNode *root) {
65     for (int i = 0; i < 26; ++i) {
66         if (root->next[i] != NULL)
67             MakeEmpty(root->next[i]);
68     }
69 
70     delete root;
71     root = NULL;
72 }

 

【经典数据结构】Trie

原文:http://www.cnblogs.com/vincently/p/4335329.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!