Trie树/字典树的简介及实现

简介: Trie树/字典树的简介及实现

1、综述

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。

它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

Trie树结构的优点在于:

1) 不限制子节点的数量;

2) 自定义的输入序列化,突破了具体语言、应用的限制,成为一个通用的框架;

3) 可以进行最大Tokens序列长度的限制;

4) 根据已定阈值输出重复的字符串;

5) 提供单个字符串频度查找功能;

6) 速度快,在两分钟内完成1998年1月份人民日报(19056行)的重复字符串抽取工作。

优点来源于Linux公社网站(www.linuxidc.com)http://www.linuxidc.com/Linux/2012-04/57911.htm

2、性质

它有3个基本性质:

1) 根节点不包含字符,除根节点外每一个节点都只包含一个字符。

2) 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

3) 每个节点的所有子节点包含的字符都不相同。

3、基本操作

其基本操作有:查找、插入和删除,当然删除操作比较少见.我在这里只是实现了对整个树的删除操作,至于单个word的删除操作也很简单.

4、实现方法

搜索字典项目的方法为:

(1) 从根结点开始一次搜索;

(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;

(3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。

(4) 迭代过程……

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

其他操作类似处理

5、Trie原理

Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

 

6、代码实现

const int branchNum = 26; //声明常量
int i;
 
struct Trie_node
{
       boolisStr;                //记录此处是否构成一个串。
       Trie_node*next[branchNum];//指向各个子树的指针,下标0-25代表26字符
       Trie_node():isStr(false)
       {
              memset(next,NULL,sizeof(next));
       }
};
 
class Trie
{
 public:
     Trie();
     voidinsert(const char* word);
     boolsearch(char* word);
     voiddeleteTrie(Trie_node *root);
       // voidprintTrie(Trie_node *root);   //new add
 
private:
    Trie_node* root;
 };
 
Trie::Trie()
{
     root =new Trie_node();
}
 
void Trie::insert(const char* word)
 {
    Trie_node*location = root;
   while(*word)
     {
       if(location->next[*word-'a'] == NULL)//不存在则建立
         {
           Trie_node *tmp = new Trie_node();
           location->next[*word-'a'] = tmp;
        }   
       location = location->next[*word-'a']; //每插入一步,相当于有一个新串经过,指针要向下移动
       word++;
    }
   location->isStr = true; //到达尾部,标记一个串
 }
 
bool Trie::search(char *word)
{
       Trie_node*location = root;
       while(*word&& location)
       {
              location= location->next[*word-'a'];
              word++;
       }
       return(location!=NULL && location->isStr);
 }
 
void Trie::deleteTrie(Trie_node *root)
{
       for(i =0; i < branchNum; i++)
       {
              if(root->next[i]!= NULL)
              {
                     deleteTrie(root->next[i]);
              }
       }
       deleteroot;
}
 
void main() //简单测试
{
       Trie t;
       t.insert("a");        
       t.insert("abandon");
 
       char * c= "abandoned";
       t.insert(c);
       t.insert("abashed");
 
       if(t.search("abashed"))
       {
          printf("true\n");  //已经插入了
       }
}

作者:铭毅天下
来源:CSDN
原文:https://blog.csdn.net/laoyang360/article/details/8097745
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章
|
5月前
|
网络协议 关系型数据库 Linux
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
在App Service for Linux环境中,无法像Windows一样直接使用网络排查工具抓包。本文介绍了如何通过TCPDUMP在Linux环境下抓取网络包,包括SSH进入容器、安装tcpdump、执行抓包命令及下载分析文件的完整操作步骤。
256 5
|
开发工具 git
idea 解决git更新冲突
idea 解决git更新冲突
1377 11
【开发课堂】支付宝小程序里如何使用自定义字体?
前言在小程序中为确保移动终端的通用性,官方是建议首选 PingFang SC 作为中文字体,以兼顾 Web 版和 Mobile 端。设计中字体大小与使用场景规范如下:在通配样式里字体如下:{font-style: normal;font-weight: normal;font: 0.
4444 11
【开发课堂】支付宝小程序里如何使用自定义字体?
|
人工智能 程序员 开发者
《深入浅出DPDK》—第2章2.5节Cache预取
以上章节讲到了多种和Cache相关的技术,但是事实上,Cache对于绝大多数程序员来说都是透明不可见的。程序员在编写程序时不需要关心是否有Cache的存在,有几级Cache,每级Cache的大小是多少;不需要关心Cache采取何种策略将指令和数据从内存中加载到Cache中;也不需要关心Cache何时将处理完毕的数据写回到内存中。
5137 0
|
存储 缓存 负载均衡
(*长期更新)软考网络工程师学习笔记——Section 17 交换技术原理
(*长期更新)软考网络工程师学习笔记——Section 17 交换技术原理
(*长期更新)软考网络工程师学习笔记——Section 17 交换技术原理
|
XML JSON 缓存
十张图学会抓包神器Fiddler
十张图学会抓包神器Fiddler
572 0
|
jenkins Java 持续交付
Jenkins----CentOS7系统搭安装与卸载Jenkins
Jenkins----CentOS7系统搭安装与卸载Jenkins
1193 2
Jenkins----CentOS7系统搭安装与卸载Jenkins
|
云安全 运维 安全
代码仓库漏洞修复及思考
#我修复的影响最深的一个Bug
12295 0
代码仓库漏洞修复及思考
|
存储 SQL 运维
技术白皮书—技术架构
架构演进理念 当前,分布式领域有3大技术方向:Sharding技术,NewSQL原生分布式技术,云原生DB技术。每种分布式都有其独特的优势和特点。PolarDB-X的架构继承了DRDS和X-DB技术的稳定性,结合了PolarDB的云原生技术,融入了NewSQL对于分布式数据一致性的能力,为用户提供新的“云原生+分布式”的产品体验。
890 0
技术白皮书—技术架构
|
设计模式 测试技术 API
干货 | 通用 api 封装实战,带你深入理解 PO
干货 | 通用 api 封装实战,带你深入理解 PO

热门文章

最新文章