一:背景

什么是字典树?

Trie树。即字典树。又称单词查找树或键树。是一种树形结构,是一种哈希树的变种。

典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以常常被搜索引擎系统用于文本词频统计。它的长处是:最大限度地降低无谓的字符串比較。查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

假如给出一些单词。and,as,at,cn。com,构建以下的字典树:

从上图能够发现:

它有3个基本性质:
1.根节点不包括字符,除根节点外每个节点都仅仅包括一个字符。

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

3.每一个节点的全部子节点包括的字符都不同样。

你可能会想。这有什么用?

第一:词频统计
可能有人要说了。词频统计简单啊,一个hash或者一个堆就能够打完收工,但问题来了,假设内存有限呢?还能这么玩吗?所以这里我们就能够用trie树来压缩下空间,由于公共前缀都是用一个节点保存的。

第二: 前缀匹配
就拿上面的图来说吧。假设我想获取全部以"a"开头的字符串,从图中能够非常明显的看到是:and,as,at,假设不用trie树,你该怎么做呢?非常显然朴素的做法时间复杂度为O(N2) 。那么用Trie树就不一样了。它能够做到h。h为你检索单词的长度,能够说这是秒杀的效果。

二:完整代码

#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1  #include<iostream>
#define MAX 26//如果字符仅仅出现 abc..k..xyz 26个小写英文字母using namespace std;struct Node
{int num;Node * next[MAX];Node(){num = 0;for (int i = 0; i < MAX; i++)next[i] = nullptr;}
};class Trie
{
public:Node *root;Trie() { root = new Node; }void Add(Node *node, const char *ch);int Find(const char *ch);void Delete(Node *node, const char *ch);
};void Trie::Add(Node *node, const char *ch)
{int len = strlen(ch);if (len == 0)return;int order = *ch - 'a';//得到字符的位置if (node->next[order] == nullptr)node->next[order] = new Node;len = strlen(ch + 1);if (len == 0)//说明是一个单词的结尾。须要将该单词出现的次数加一{node->next[order]->num++;return;//以下的递归能够结束了}Add(node->next[order], ch + 1);//递归下去
}int Trie::Find(const char *ch)
{Node *p = root;while (*ch != '\0'){int order = *ch - 'a';if (p->next[order] == nullptr)return 0;else{ch++;p = p->next[order];}}return p->num;
}void Trie::Delete(Node *node, const char *ch)
{int len = strlen(ch);if (len == 0)return;int order = *ch - 'a';if (node->next[order] == nullptr)return;len = strlen(ch + 1);if (len == 0 && node->next[order]->num != 0)//找到该单词而且该单词出现次数大于0{node->next[order]->num--;return;}Delete(node->next[order], ch + 1);
}int main()
{Trie tree;tree.Add(tree.root, "strawberry");tree.Add(tree.root, "grandfather");tree.Add(tree.root, "policeman");tree.Add(tree.root, "breakfast");tree.Add(tree.root, "mutton");tree.Add(tree.root, "bus");tree.Add(tree.root, "bus");tree.Add(tree.root, "computer");int k = tree.Find("bus");cout << k << endl;//2tree.Delete(tree.root, "bus");cout << tree.Find("bus") << endl;//1return 0;
}

三:总结

细心的朋友会发现,上面的代码有缺陷。拿Delete操作来说吧,if (len == 0 && node->next[order]->num != 0)。这句代码事实上是有问题的,由于我没有考虑node->next[order]->num==1的情况,假设等于1。如今运行删除。自减1,num就是0了。也就是这个单词从来没出现,那么表示这个 单词这一条路径都要delete(假设这条路径上不存在其它的单词)。而且root处的指针须要reset。

好了,尽管代码是有缺陷的。可是仅仅要把实现搞懂,该怎样进行完好那就是看个人的需求了。

返回文件夹---->数据结构与算法文件夹

另外推荐读者以下这篇博客: http://blog.csdn.net/v_july_v/article/details/6897097,JULY大牛

图片资源和代码參考:http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html

转载于:https://www.cnblogs.com/blfbuaa/p/7299991.html

数据结构与算法系列----字典树相关推荐

  1. 看图轻松理解数据结构与算法系列(2-3树)

    前言 推出一个新系列,<看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的 ...

  2. 导师计划--数据结构和算法系列(上)

    导师计划已经开始一个月了,自己的讲解的课程选择了数据结构和算法.这个系列的讲解分为上下两章,javascript语言辅助.本篇文章为上章,涉及的内容是基本的数据结构.在日本,晚上没事安排@-@,时间还 ...

  3. 导师计划 -- 数据结构和算法系列(上)

    导师计划已经开始一个月了,自己的讲解的课程选择了数据结构和算法.这个系列的讲解分为上下两章,javascript语言辅助.本篇文章为上章,涉及的内容是基本的数据结构.在日本,晚上没事安排@-@,时间还 ...

  4. 数据结构和算法系列13 五大查找之哈希查找

    原文地址 http://www.cnblogs.com/mcgrady/p/3294871.html 数据结构和算法系列13 五大查找之哈希查找 这一篇要总结的是五天查找的最后一篇,哈希查找,也称为散 ...

  5. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  6. 数据结构与算法之2-3-4树

    数据结构与算法之2-3-4树 原文来自个人博客(求访问/关注/收藏): https://bbing.com.cn/ CSDN个人博客不定期转载 平衡树 [外链图片转存失败,源站可能有防盗链机制,建议将 ...

  7. 『数据结构与算法』解读树(Tree)和二叉树(Binary Tree)!

    『数据结构与算法』解读树(Tree)和二叉树(Binary Tree)! 文章目录 一. 树 1.1. 树的定义 1.2. 树的基本术语 1.3. 树的性质 二. 二叉树 2.1. 二叉树的定义 2. ...

  8. 数据结构与算法系列——排序(10)_归并排序

    1. 工作原理(定义) 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,指的是将两个已经排序的序列合并成一个序列的操作.该算法是采用分治法(Divide and Conquer ...

  9. 【Solr】之倒排索引算法【字典树】2

    一.什么是倒排索引? 1.1 概念 见其名知其意,有倒排索引,对应肯定,有正向索引. 正向索引(forward index),反向索引(inverted index)更熟悉的名字是倒排索引. 在搜索引 ...

  10. 数据结构与算法一览(树、图、排序算法、搜索算法等)- Review

    算法基础简介 - OI Wiki (oi-wiki.org) 文章目录 1. 数据结构介绍 1.1 什么是数据结构 1.2 数据结构分类 2. 链表.栈.队列:略 3. 哈希表:略 4. 树 4.1 ...

最新文章

  1. 从源码分析DEARGUI之异步调用函数对比
  2. 震惊!NV Volta或用上48GB GDDR6显存
  3. hdu1428(spfa与记忆化搜索)
  4. cf13C Sequence(DP)
  5. css 浮动和清除浮动
  6. 剑指Offer - 面试题53 - II. 0~n-1中缺失的数字(二分、位运算)
  7. Nginx04---编译安装
  8. CSV Data Set Config设置
  9. 无法解析 uafxcw.lib_二级建造师《实务科目》推荐知识点习题,附中业网校答案解析...
  10. RLE压缩及优化--图片压缩
  11. CentOS下使用Varnish为网站加速
  12. 造轮子:前端模板引擎
  13. Tomcat session集群
  14. 苹果id注册邮箱方法
  15. vs2010专业板产品密钥
  16. 百词斩不复习_不背单词好用还是百词斩好用?
  17. 数据表对应关系(一对一、一对多、多对多)
  18. 瞬态抑制二极管型号参数对照表,想要的都在这里
  19. 用计算机求算术平方根,6.1用计算机计算算术平方根.ppt
  20. Linux操作系统下复现github上的项目(一):下载项目、配置环境

热门文章

  1. java中static关键字的作用_C++ static关键字到底有什么作用
  2. 2019测试指南-web应用程序安全测试(二)识别应用程序入口点
  3. Java多线程第三节-线程的正确停止
  4. 【CentOS】Centos下pip的安装
  5. 结对编程之求首尾相连数组中最大子数组的和
  6. Upgrading to Java 8——第四章 The Stream API
  7. 图片滚动js 实现图片无缝滚动
  8. 陶哲轩实分析 习题 12.5.8 :度量空间中有界闭集不一定是紧集
  9. “经历”重于“技术”
  10. 上广电D2527彩电兴暗故障检修