字典树

字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

----摘自必应

其建立过程类似链表的生成,顾名思义,每次我们查询、插入一个单词,都从单词首字母开始,查看本节点内是否存在指向下一字母的指针,依次向后查找字典树。在结构体里还可以存放其他变量,使得查找到单词时可以输出和单词对应的数据。

插入、查找过程见代码详解。

注意:G++提交字典树题目容易MLE,请用C++提交。

模板

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 struct Node
 5 {
 6     Node *ap[26];//保存指向下一节点的指针
 7     //---
 8     //存放每个单词的一些属性,数据类型根据需求自定,或者使用结构体保存
 9     int num;//保存出现次数
10     //---
11     void ini()//生成新节点时调用对其初始化
12     {
13         num=0;
14         for(int i=0;i<26;i++)
15             ap[i]=NULL;
16     }
17 }*head;//申明头指针用于指向字典树
18 void Insert(string str)
19 {
20     Node *now=head,*makeNode;//now指针用于指向当前位置,makeNode用于生成新节点,再让now->ap[odx]指向新生成的节点
21     for(int i=0;i<str.length();i++)
22     {
23         int odx=str[i]-'a';
24         if(now->ap[odx]==NULL)//如果为空说明字典树没有后续的内容,就建立新节点
25         {
26             makeNode=new Node;
27             makeNode->ini();
28             now->ap[odx]=makeNode;
29         }
30         now=now->ap[odx];//迭代now指针,使其转移到下一位置
31     }
32     now->num++;
33 }
34 bool Find(string str)//返回值根据要求而定
35 {
36     int counter=0;
37     Node *now=head;
38     for(int i=0;i<str.length();i++)//迭代过程类似插入
39     {
40         int odx=str[i]-'a';
41         counter=now->num;
42         if(now->ap[odx]==NULL)
43             return false;
44         now=now->ap[odx];
45     }
46     return true;
47 }
48 void del(Node *root)
49 {
50     if(root==NULL)
51         return;
52     for(int i=0;i<26;i++)
53         del(root->ap[i]);
54     delete root;
55 }

 

posted @ 2016-08-17 10:47  Luke_Ye  阅读(230)  评论(0编辑  收藏  举报