Part one【何谓字典树】

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。

比如我们创建一个字典树包含下列单词:
inn, int, at, age, adv, ant

是不是非常的类似于新华字典的拼音查词的顺序啊,比如查“生”就要从sh声母开始找e再找n再找g。

Part two【字典树的数据结构】

专门以小写字母为例,可以用数据结构为:

typedef struct Trie_node{  int count;                    // 统计单词前缀出现的次数  struct Trie_node* next[26];   // 指向各个子树的指针  bool exist;                   // 标记该结点处是否构成单词
}TrieNode , *Trie; 

简单版本:

typedef struct Trie{int v;bool exist; Trie *next[maxn];//maxn是由你规定好的字符串的字符来源决定的,比如小写字母26就够了。
}Trie;

Part three【字典树的生成】

我们需要用到字典树来对字符串进场分析的时候就要将这个字符串放进我们的字典树(就像字典收录新词一样)但是没真正像收录新词那么难。我们只需要2步。

1.定义指向根节点的指针P,和一个交换用的指针Q

2.从字符串开始下标到结束(0-len)我们依次将字符做出节点。方法是:将字母由字典序化为数字,则指针next[该字典序]指向的地方为空时我们开辟一个指针空间给Q,将其计数初始化为1。然后从0-MAXN将他next[]指向的全部初始化为NULL。再将P的next[字典序]指针指向Q,P更新为P的next[字典序]。若指针next[字典序]指向的地方已经有节点了,我们将其节点的计数++;更新P为P的NEXT。

符合简单数据结构的版本:

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

符合第一个数据结构的版本(分成两个函数):

TrieNode* createTrieNode(){ //其实就是创建根节点 TrieNode* node = (TrieNode *)malloc(sizeof(TrieNode));  node->count = 0;  node->exist = false;  memset(node->next , 0 , sizeof(node->next));    // 初始化为空指针  return node;
}  void Trie_insert(Trie root, char* word){  Trie node = root;  char *p = word;  int id;  while( *p ){  id = *p - 'a';  if(node->next[id] == NULL){  node->next[id] = createTrieNode();  }  node = node->next[id];  // 每插入一步,相当于有一个新串经过,指针向下移动  ++p;  node->count += 1;      // 这行代码用于统计每个单词前缀出现的次数(也包括统计每个单词出现的次数)  }  node->exist = true;        // 单词结束的地方标记此处可以构成一个单词
}  

Part four【一些功能】

1.查找以特定字符串作为前缀的数目(符合第二个简单数据结构)

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

2.查找某字符串在不在字典中(符合第一个数据结构)

void search_str(Trie_node root,char *str){ //查找串是否在该trie树中if(NULL==root || *str=='\0'){printf("trie is empty or str is null\n");return;}char *p=str;Node *t=root;while(*p!='\0'){     if(t->child[*p-'a']!=NULL){t=t->child[*p-'a'];p++;}elsebreak;}if(*p=='\0'){if(t->count==0)cout<<"该字符串不在trie树中,但该串是某个单词的前缀\n";elsecout<<"该字符串在该trie树中\n";}elsecout<<"该字符串不在trie树中\n";
}

【字典树】字典树的创建(入门详细介绍)相关推荐

  1. Docker新手入门详细介绍

    Docker新手入门详细介绍 Docker 起源于 dotCloud 公司的内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护,2013 ...

  2. mysql介绍索引类型的章节_mysql索引总结--mysql索引类型以及创建的详细介绍

    关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...

  3. 黑客专业术语——入门详细介绍

    前言 黑客专业术语是黑客们及内部交流的专有名词,理解专业术语,对入门黑客是有必要的 1.肉鸡 所谓肉鸡,是一种很形象的比喻,指那些可以被黑客随意控制的电脑,可以随意操纵肉鸡,却又不被对方察觉. 2.木 ...

  4. asp.net入门详细介绍

    掌握一门.NET面向对象语言,C#或VB.NET 我强烈反对在没系统学过一门面向对象(OO)语言的前提下去学ASP.NET. ASP.NET是一个全面向对象的技术,不懂OO,那绝对学不下去!      ...

  5. linux入门详细介绍

    此文章较长,适合慢读,可查看linux入门大全:包括零基础入门.推荐Linux资源:linux视频文档资料下载 操作系统是一种特殊的软件,用来让计算机硬件和软件协同工作,并且处理我们敲打键盘和移动鼠标 ...

  6. Evaluate:huggingface评价指标模块入门详细介绍

    一.介绍 evaluate 是huggingface在2022年5月底搞的一个用于评估机器学习模型和数据集的库,需 python 3.7 及以上.包含三种评估类型: Metric:用来通过预测值和参考 ...

  7. 关于补天SRC小白入门详细介绍

    前言 只是单纯的介绍一下补天的界面以及规则与操作方式,不涉及任何与技术相关的东西,其目的是让新手快速了解补天,并在补天大展身手.如涉及到了任何侵权问题,请联系我删帖. 补天SRC介绍 补天漏洞响应平台 ...

  8. Pandas入门详细教程

    作者:luanhz 来源:小数志 导读 本文主要是对pandas进行入门详细介绍,通过本文你将系统性了解pandas为何会有数据分析界"瑞士军刀"的盛誉. 行文二级目录 01 关于 ...

  9. python数据科学系列:pandas入门详细教程

    导读 前2篇分别系统性介绍了numpy和matplotlib的入门基本知识,今天本文自然是要对pandas进行入门详细介绍,通过本文你将系统性了解pandas为何会有数据分析界"瑞士军刀&q ...

最新文章

  1. Anaconda3+python3.7.10+TensorFlow2.3.0+PyQt5环境搭建
  2. Lombok常用注解和功能
  3. WinForm窗体拖动代码
  4. 工作275:表单验证重置
  5. Des与3Des加密解密
  6. invalid floating point operation什么意思_Point-MVSNet:基于多视角的点云重建网络
  7. eplan连接定义点不显示_显示无线桥接成功,但是连接副路由器的设备依然上不去网的问题...
  8. 一加Ace渲染图曝光:大眼三摄+150W超快闪充
  9. ReentrantLock 公平锁和非公平锁加锁和解锁源码分析(简述)
  10. python aes加解密
  11. 五大车载操作(VOS)系统
  12. ValueError:only one element tensors can be converted to Python scalars解决办法
  13. 【MySQL基本查询】Create(创建), Retrieve(读取),Update(更新),Delete(删除)
  14. 服务器显卡直通和GPU问题分析
  15. python 汉字与拼音的转换--pypinyin
  16. 海淘手表Invicta8926OB到手~晒图
  17. Ubunbu18.4运行代码bug提示:Successful NUMA node read from SysFS had negative value (-1)
  18. python得垃圾回收机机制gc
  19. 外文翻译原文附在后面_外文翻译及外原文(参考格式).doc
  20. android导航地图,地图导航-Android平台-开发指南-高德地图车机版 | 高德地图API

热门文章

  1. 华为的5G到底有多厉害?
  2. 2021观澜二中高考成绩查询入口,深圳2019年中考成绩出炉 各校高分成绩汇总
  3. 全国企业信用信息公示系统
  4. H2O机器学习平台容器化部署——基于Docker
  5. Leetcode滑窗系列(java):643. 子数组最大平均数 I
  6. 关于实现某宝或某妈永久登录
  7. 常州华翎六月风钢管舞惊人的优势
  8. Android Tethering
  9. 为富人服务,挣富人的钱
  10. educoder:实验七 元组和集合