字典树

微博:
@TankyWoo基
新博客:
TankyWoo

字典树(讲解+模版)

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

 

 

字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。


Trie的数据结构定义:

复制代码
#define MAX 26
typedef 
struct Trie   
{   
    Trie 
*next[MAX];   
    
int v;   //根据需要变化
};   
 
Trie 
*root;
复制代码

 

next是表示每层有多少种类的数,如果只是小写字母,则26即可,若改为大小写字母,则是52,若再加上数字,则是62了,这里根据题意来确定。
v可以表示一个字典树到此有多少相同前缀的数目,这里根据需要应当学会自由变化。

Trie的查找(最主要的操作):
(1) 每次从根结点开始一次搜索;
(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;   (3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。   
(4) 迭代过程……   
(5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。

这里给出生成字典树和查找的模版
生成字典树:

 

 

复制代码
void createTrie(char *str)
{
    
int len = strlen(str);
    Trie 
*= root, *q;
    
for(int i=0; i<len; ++i)
    {
        
int id = str[i]-'0';
        
if(p->next[id] == NULL)
        {
            q 
= (Trie *)malloc(sizeof(Trie));
            q
->= 1;    //初始v==1
            for(int j=0; j<MAX; ++j)
                q
->next[j] = NULL;
            p
->next[id] = q;
            p 
= p->next[id];
        }
        
else
        {
            p
->next[id]->v++;
            p 
= p->next[id];
        }
    }
    p
->= -1;   //若为结尾,则将v改成-1表示
}
复制代码

 

 

接下来是查找的过程了:

 

复制代码
int findTrie(char *str)
{
    
int len = strlen(str);
    Trie 
*= root;
    
for(int i=0; i<len; ++i)
    {
        
int id = str[i]-'0';
        p 
= p->next[id];
        
if(p == NULL)   //若为空集,表示不存以此为前缀的串
            return 0;
        
if(p->== -1)   //字符集中已有串是此串的前缀
            return -1;
    }
    
return -1;   //此串是字符集中某串的前缀
}
复制代码

对于上述动态字典树,有时会超内存,比如 HDOJ 1671 Phone List,这是就要记得释放空间了:

 

复制代码
int dealTrie(Trie* T)
{
    
int i;
    
if(T==NULL)
        
return 0;
    
for(i=0;i<MAX;i++)
    {
        
if(T->next[i]!=NULL)
            deal(T
->next[i]);
    }
    free(T);
    
return 0;
}
复制代码

 

 

题目分析+解答报告:

HDOJ 1251 统计难题:
http://www.wutianqi.com/?p=1364

HDOJ 1671 Phone List
http://www.wutianqi.com/?p=1366

这里还有几个字典树的相关资料,我上传了RaySource里了,顺便和大家分享下:

算法合集之《浅析字母树在信息学竞赛中的应用》

字典树


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

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

相关文章

Unity3D谷歌地球

Unity3D实现谷歌地球 在Unity3d平台实现的类似谷歌地球的功能&#xff0c;可动态在线加载谷歌&#xff0c;ArcGis,BingMap,天地图等影像&#xff0c;也可加载国界线等矢量文件以及在线加载高程文件。 视频链接: 地球操作:https://www.bilibili.com/video/BV1mT4y1P771 地球…

【转载保存】获取页面编码

https://blog.csdn.net/u010061897/article/details/9116879

Unity OnTriggerEnter不调用

Unity OnTriggerEnter不调用需要在对象上添加Rigidbody组件&#xff01;

jsoup的Elements类

一、简介 该类是位于select包下&#xff0c;直接继承自Object&#xff0c;所有实现的接口有Cloneable, Iterable, Collection, List 类声明&#xff1a;public class Elements extends Object implements List, Cloneable 可以使用Element.select(String) 方法去得到Element…

线段树的操作

登录 | 注册 MetalSeed 思绪来得快去的也快&#xff0c;偶尔会在这里停留。 目录视图摘要视图订阅 移动信息安全的漏洞和逆向原理 程序员11月书讯&#xff0c;评论得书啦 Get IT技能知识库&#xff0c;50个领域一键直达数据结构专题——线段树 标签&#xff1a; …

UnrealEngine4 - 关于UObject被自动GC垃圾回收的巨坑

1 出现的问题 在一个插件中新建了一个静态的继承于UObject的对象 static UMyObject* m_Object nullptr; 1 然后在插件的蓝图函数中对其进行了初始化: m_Object NewObject<UMyObject>(); 1 过了一段时间之后发现这个对象被析构&#xff0c;导致野指针&#xff0c;造成…

【转载保存】Java+Selenium使用

环境搭建&#xff1a;https://blog.csdn.net/u011541946/article/details/72898514 环境搭建问题解决&#xff1a;https://blog.csdn.net/u010366748/article/details/72872190 package server;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By; import o…

UE4加载osgb倾斜摄影数据

在UE4引擎中动态加载调度osgb倾斜摄影数据&#xff0c;利用多线程动态加载瓦片数据&#xff0c;可以顺畅加载海量的瓦片数据。最大可加载200G以上数量级。 Unity3D加载osgb倾斜摄影数据:Unity3d(UE4)动态加载osgb倾斜摄影数据_Answer-3的博客-CSDN博客_unity加载osgb qq:1749…

相对路径转成绝对路径

public static String getAbsoluteURL(String baseURI, String relativePath) {String abURL null;try {URI base new URI(baseURI);// 基本网页URIURI abs base.resolve(relativePath);// 解析于上述网页的相对URL&#xff0c;得到绝对URIURL absURL abs.toURL();// 转成U…

Unity/UE读取OPC UA和OPC DA数据(UE4)

Unity/UE4通过OPC UA和OPC DA协议读取PLC数据&#xff0c;通过采集服务将数据采集到数据库中&#xff0c;Unity3d和UE4再从数据库中读取数据进行展示&#xff0c;用于三维数字孪生系统接入自动化系统的硬件数据。支持WinCC,组态王&#xff0c;Kepware等组态软件的数据接入。 W…

【转载保存】Selenium WebDriver API常用方法

详细&#xff1a;https://blog.csdn.net/yjlch1016/article/details/78115813#commentBox 中文API&#xff1a;https://blog.csdn.net/m0_37831339/article/details/81206427

Unity3d(UE4)动态加载osgb倾斜摄影数据

在Unity3D平台动态加载调度倾斜摄影数据&#xff0c;利用多线程动态加载瓦片数据&#xff0c;可以顺畅加载海量的瓦片数据。目前测试可流畅加载200G左右数据&#xff0c;支持加载本地数据&#xff0c;数据可不放在Unity工程内&#xff0c;也可以将数据放置在服务器上实现网络加…

java多线程爬虫框架crawler4j的使用

一开始找jar包找了好久都没找到&#xff0c;后来花了6个积分把所有的依赖包找到了&#xff0c;现在放在百度云供大家免费下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/12MTMy4d4e6hZsmWAdXbUMQ 提取码&#xff1a;433g 注意这些依赖包是3.5版本的不是最新版本。 …

昂贵的聘礼 poj 1062 dijsk

昂贵的聘礼Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 46539 Accepted: 13819 Description 年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了&#xff0c;于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出…

Berkeley DB作用

Berkeley DB是一个嵌入式数据库&#xff0c;这里的嵌入式和嵌入式系统无关&#xff0c;嵌入式数据库的意思是不需要通过JDBC访问数据库&#xff0c;也不单独启动进程来管理数据&#xff0c;Berkeley DB运行在网络爬虫所在的进程空间。 Berkeley DB中的一个数据库只能存储键值对…

【保存】java学习全套视频下载地址

http://www.java1234.com/javaxuexiluxiantu.html

java网络爬虫视频教程下载

http://www.java1234.com/javapachongxuexiluxiantu.html

WebMagic学习总结

教科书式文档&#xff1a;http://webmagic.io/docs/zh/posts/ch4-basic-page-processor/ 概念介绍&#xff1a;http://448230305.iteye.com/blog/2145296 入门教程&#xff1a;https://blog.csdn.net/zhengmengjia/article/details/42028283#commentBox 详细教程&#xff1a; h…

【优秀文章保存】webcollector抽取新闻正文

jar包下载&#xff1a;https://github.com/CrawlScript/WebCollector/blob/master/webcollector-2.73-alpha-bin.zip 使用介绍(超详细)&#xff1a;https://blog.csdn.net/wangmx1993328/article/details/81667284?utm_sourceblogxgwz0#commentBox 网页抽取算法介绍&#xff1…

Problem E: 校庆

Problem E: 校庆 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1520 Solved: 574Description 2017年10月28日是zstu的120周年校庆&#xff0c;撒花&#xff0c;撒花。为此KI决定设计一个程序&#xff0c;来庆祝我们的校庆&#xff1a; 给出某一天的日期year-month-date…