浅谈 trie树 及其实现

定义又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,

如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。

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

三个基本性质:

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

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

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

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

缺点:如果存在大量字符串且这些字符串基本没有公共前缀,则相应的trie树将非常消耗内存。

典型应用:统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计

至于Trie树的实现,可以用数组,静态分配空间,也可以用指针动态分配

Trie树的操作

在Trie树中主要有3个操作,插入、查找和删。一般情况下Trie树中很少存在删除单独某个结点的情况,因此只考虑删除整棵树。

假设存在字符串str(都为小写字母),Trie树的根结点为root。i=0,p=root。

typedef struct stu
{int n,flag;         //n记录前缀及单词的个数,flag标记单词是否存在struct stu *next[26];          //子节点
}node;
View Code
node* creat_node()
{node *p=(node *)malloc(sizeof(node));p->n=p->flag=0;memset(p->next,0,sizeof(p->next));return p;
}
建立新节点并初始化

1、插入

  1)取str[i],判断p->next[str[i]-'a']是否为空,若为空,则建立结点temp,并将p->next[str[i]-'a']指向temp,然后p指向temp;

   若不为空,则p=p->next[str[i]-'a'];

  2)i++,继续取str[i],循环1)中的操作,直到遇到结束符'\0',此时将当前结点p中的 flag 置为true。

void trie_insert(node *p,char *s)
{int i;while(*s!='\0'){i=*s-'a';if(p->next[i]==0)p->next[i]=creat_node();p=p->next[i];s++;p->n++;}p->flag=1;
}
插入字符串

2、查找

  1)取str[i],判断判断p->next[str[i]-'a']是否为空,若为空,则返回false;若不为空,则p=p->next[str[i]-'a'],继续取字符。

  2)重复1)中的操作直到遇到结束符'\0',若当前结点p不为空并且 flag 为true,则返回true,否则返回false。

int trie_search(node *p,char *s)
{int i;while(*s!='\0'){i=*s-'a';p=p->next[i];if(p==0)return 0;s++;}return p->n;
}
查找字符串,并返回其个数

3、删除

  删除可以以递归的形式进行删除。

void trie_del(node *root)
{int i;for(i=0;i<M;i++)                     //M为子节点的个数if(root->next[i]!=NULL)trie_del(root->next[i]);free(root);
}
递归删除整棵树

 

 

转载于:https://www.cnblogs.com/happy-lcj/p/3890417.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker-compose 安装与基本使用(四)

安装 Docker-Compose Compose有多种安装方式,例如通过 shell, pip以及将 Compose作为容器安装等。本次安装以Shell 为主。 通过以下命令自动下载并安装适应系统版本的 Compose: curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(un…

git pull 报错:Untracked Fles Preventing Merge

场景 使用 git pull 命令更新报错解决 找到对应的文件删除后重新打开项目。

SpringBoot 配置多数据源

项目Git地址&#xff1a;SpringBoot 配置多数据源&#xff1a;Jacob-multi-data-source 准备工作 准备两个数据库(此模块中两个数据库一个为本地 一个为远程&#xff0c;本地为主&#xff0c;远程为从)。然后建表。 #本地库 CREATE TABLE username (id bigint(11) NOT NULL AUT…

微服务之基础知识

什么是微服务架构 微服务是系统架构上的一种设计风格&#xff0c; 它的主旨是将一个原本独立的系统拆分成多个小型服务&#xff0c;这些小型服务都在各自独立的进程中运行&#xff0c;服务之间通过基于HTTP的RESTful API进行通信协作。 被拆分成的每一个小型服务都围绕着系统中…

还是俄罗斯方块之android版

前面的&#xff0c;口水话 请直接跳过。 虽然现在不比以前了 也没多少人气了&#xff0c;放到首页 都不到几百的点击量。也许博客园整体水平也是在往水的方向发展。不谈那些了&#xff0c;哥也曾经辉煌过 有过一天上千的点击量 &#xff0c;哥也曾经有过粉丝&#xff0c;被小妹…

自定义快捷命令程序(VC++加批处理)

一 概述 在看《从小工到专家-程序员修炼之道》时&#xff0c;看到建议使用Shell&#xff0c;很有感触。在很多时候&#xff0c;通过键盘操作&#xff0c;比鼠标的确会块很多&#xff0c;如果能用好shell命令&#xff08;或批处理命令&#xff09; &#xff0c;的确能节省我们…

7. Adapter

转载于:https://www.cnblogs.com/anit/p/3930202.html

jQuery 学习笔记(jQuery: The Return Flight)

第一课. ajax&#xff1a;$.ajax(url[, settings]) 练习代码&#xff1a; $(document).ready(function() {$("#tour").on("click", "button", function() {$.ajax(/photos.html, {success: function(response) {$(.photos).html(response).fadeI…

于我,过去,现在和未来 —— 西格里夫·萨松

In me, past, present, future meet            于我&#xff0c;过去、现在和未来To hold long chiding conference              商讨聚会 各执一词 纷扰不息My lusts usurp the present tense             林林总总的 欲望&#xff0c;…

Java assert关键字

Java assert关键字 Assert 简介 Java2在1.4中新增了一个关键字&#xff1a;assert。在程序开发过程中使用它创建一个断言(assertion)。语法格式有两种&#xff1a; assert condition; 这里condition是一个必须为真(true)的表达式。如果表达式的结果为true&#xff0c;那么断言为…

计算几何 半平面交

LA 4992 && hdu 3761 Jungle Outpost 杭电的有点坑啊。。一直爆内存&#xff0c;后来发现大白的半平面交模板那里 point *p new point[n]; line *q new line[n]这里出了问题&#xff0c;应该是在函数里面申请不了比较大的数组&#xff0c;所以爆内存。。我在全局定义…

Maven 强制导入jar包

场景 有时候因为各种原因(依赖有了&#xff0c;jar包有了)&#xff0c;项目中就是没有这个jar包。 在需要强导的项目中创建lib文件夹&#xff0c;将需要强导的jar包访问lib中。添加依赖$&#xff5b;pom.basedir&#xff5d;:获取当前所在的项目目录 $&#xff5b;pom.basedir&…

《Java 高并发》03 线程的生命周期

相关概念 进程是指一个内存中运行的应用程序&#xff0c;每个进程都有自己独立的一块内存空间&#xff0c;一个进程中可以启动多个线程。 一个进程是一个独立的运行环境&#xff0c;它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含…

Spring boot 整合dynamic实现多数据源

项目git地址&#xff1a;Jacob-dynamic 准备工作 # 创建数据库db1 CREATE DATABASE db1CHARACTER SET utf8 COLLATE utf8_bin # 创建user表 CREATE TABLE user (id int(11) DEFAULT NULL,name varchar(255) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8 # 添加数据 INSERT…

Could not autowire. No beans of 'JavaMailSender' type found..md

Could not autowire. No beans of JavaMailSender type found. 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.1.5.RELEASE</version> </depe…

极客Web前端开发资源集锦

本周我们带来的前端推荐包含当前热门的bootstrap&#xff0c;html5&#xff0c;css3等技术内容和新闻话题&#xff0c;如果你还想近一步学习如何开发&#xff0c;还可以关注我们的极客课程库&#xff0c;里面涵盖了现代开发技术的‘学’与‘习’的全新功能。希望对大家有所帮助…

使用 Spring Cloud 实现微服务系统

使用 Spring Cloud 实现微服务系统 准备工作&#xff1a;为了方便创建项目&#xff0c;以及各版本以来关系&#xff0c;此次创建项目使用 Spring Assistant插件。 创建单体服务中心项目 启用服务端的服务注册&#xff0c;发现功能 EnableEurekaServer SpringBootApplication pu…

android 小工具:pc 上用 curl 命令打开手机浏览器,浏览指定网址

测试 API 时或其它情况经常需要在手机浏览器中输入 url 一长串的 url 输起来真是麻烦 AirDroid 很强大也不用数据线&#xff0c;但有时老断开连接&#xff0c;不是很爽。发到手机 qq 吧还得手动粘贴 所以自己开发了一个小工具 pc 上用 curl 发一条命令&#xff0c;命令中输入要…

iOS: How To Make AutoLayout Work On A ScrollView

转载自&#xff1a; http://natashatherobot.com/ios-autolayout-scrollview/ Posted on June 11th, 2014 Ok, I’ll admit. I’ve been seriously struggling with AutoLayout ever since it’s been introduced. I understand the concept, and I LOVE the idea of it, but w…

windows 中搭建Zookeeper的搭建

个人博客 &#xff1a;https://www.siyuan.run CSDN&#xff1a;https://blog.csdn.net/siyuan 微信小程序&#xff1a;思远Y 下载 下载地址&#xff1a; https://mirrors.cnnic.cn/apache/zookeeper/ PS&#xff1a;zookeeper 从3.5.5以后的版本带有bin标识的包&#xff0c;否…