字典树,顾名思义,是关于“字典”的一棵树。 即:它是对于字典的一种存储方式(所以是一种数据结构而不是算法)。 这个词典中的每个“单词”就是从根节点出发一直到某一个目标节点的路径,路径中每条边的字母连起来就是一个单词。

实际上不一定是字典,也可以是二进制哦

我们要理解一个概念,字典树是一种数据结构,类似字典的查找很快的结构。故它拥有insert插入和qurey查找功能。
需要注意的是,有些值可能会在到达树的末梢之前就可以返回了[也就是说不一定是一条边一个字母],例如:

OK,理顺了概念,直到他是What,下面我来考虑如何代码HOW实现
我们知道,字典树具有和字典一样的插入和查询的功能。

我们先来看插入:
每次都从根结点开始搜索,然后依次遍历你需要插入单词的字母,如果该字母没有在树中,则添加此字母结点到树根。
直到所有字母遍历完毕,则标记最后一个结点

再来看看查询:
查询和插入其实完全一致,只是少了插入这个环节。每次都从根结点开始搜索,然后依次遍历你需要插入单词的字母,如果该字母没有在树中,则说明找不到此结点。
直到所有字母遍历完毕,说明找到了

总结就是:每次从根结点开始遍历,遍历过程中判断是否存在此字母结点,直到整个单词遍历完毕

接下来是伪代码模板:

const int M = 100000000000000//反正应该很大具体怎么算你。。。
const int N = 26;//如果是字母就是26,二进制就是2
int trim[M][N],idx;//trim是字典树,idx是指针索引
int cnt[M];
//插入
insert(T[] data)
{int p=0;//遍历整个单词for(int i=0;i<data.size;i++){//如果没有此结点就新建结点if(trim[p][data[i]]==0)trim[p][data[i]]=++idx;p=trim[p][data[i]];//继续到下一结点}    cnt[p]++;//标记最后一个结点
}
//查找
query(T[] data)
{int p=0;//遍历整个单词for(int i=0;i<data.size;i++){//如果没有此结点就没有这个单词if(trim[p][data[i]]==0)return false;p=trim[p][data[i]];//继续到下一结点}   return true;//此处也能返回cnt,表示此单词出现次数
}

模板仅供参考,理解思路才是真理。
好了,现在知道What和How,那么Why?,那还不是为了学算法以后找工作,不然狗都不学系列。顺带一提,字典树能写的题,一般用普通的哈希表其实也能写,STL这么香为什么不用。
可,现在来上leecode题目。因为我开头说了字典树可以解决诸如单词或者二进制的存储,所以,我就举一个单词类的题和一个二进制的题。

前K个高频单词

这题是非常经典的字母计数类型的题了
这就用到了cnt数组,刚好用来计数。
顺带一提 这题其实用map代替自己写的trim也是完全可以的。

bool cmp(const pair<string,int>& s1, const pair<string,int>& s2)
{if(s1.second==s2.second)return s1.first<s2.first;elsereturn s1.second > s2.second;
}
class Solution {public:int son[100010][26],idx;int cnt[100010];void insert(string str){int p=0;for(int i=0;i<str.size();i++){int u=str[i]-'a';if(!son[p][u])son[p][u]=++idx;//如果没有就建根p=son[p][u];}cnt[p]++;}int quray(string str){int p=0;for(int i=0;i<str.size();i++){int u=str[i]-'a';if(!son[p][u])return -1;//如果没有找到就返回p=son[p][u];}return cnt[p];}vector<string> topKFrequent(vector<string>& words, int k) {set<string> s;for(int i=0;i<words.size();i++){insert(words[i]);s.insert(words[i]);}vector<pair<string,int>> res;for(set<string>::iterator it=s.begin() ;it!=s.end();it++){res.push_back({(*it),quray((*it))});}sort(res.begin(),res.end(),cmp);vector<string> ans;for(int i=0;i<k;i++)ans.push_back(res[i].first);return ans;}
};

那么下一题

这题是比较经典的字典树的题目了。
前提是你对二进制的基本功掌握不错。
这里插入操作是将x作为二进制插入进字典树
查找操作是查找和x异或最大的值【也就是答案res】

class Solution {public:int son[300000][2],idx;void insert(int x){int p=0;for(int i=30;~i;i--){int &s=son[p][x>>i&1];if(!s)s=++idx;p=s;}}int query(int x){int res=0,p=0;for(int i=30;~i;i--){int s=x>>i&1;if(son[p][!s]){res+= 1<<i;p=son[p][!s];}else p=son[p][s];}return res;}int findMaximumXOR(vector<int>& nums) {for(int i=0;i<nums.size();i++)insert(nums[i]);int res=0;for(int i=0;i<nums.size();i++)res=max(res,query(nums[i]));return res;}
};

最后

算法学习的路上是非常艰辛无聊孤独痛苦无助自闭的过程,但是如果你坚持走下去了,那么当你拿到年薪百万的时候你会感谢那个曾经熬过七重孤独的自己
----龙之介

字典树Trim详解+相关例题---龙之介算法基础课相关推荐

  1. 字典树原理详解及其Python实现

    一.原理详解 1.初步介绍: 字典树又名前缀树,Trie树,是一种存储大量字符串的树形数据结构,经常被搜索引擎系统用于文本词频统计. 除此之外也常用于计算左右信息熵.计算点互信息. 下图演示了一个保存 ...

  2. python字典的用法_Python字典的用法详解(附示例)

    本篇文章给大家带来的内容是关于Python字典的用法详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 字典的表现形式为:{key:value},键和值之间用冒号分隔,每个 ...

  3. 【Linux驱动开发】设备树详解(二)设备树语法详解

    ​ 活动地址:CSDN21天学习挑战赛 [Linux驱动开发]设备树详解(一)设备树基础介绍 [Linux驱动开发]设备树详解(二)设备树语法详解 [Linux驱动开发]设备树详解(三)设备树Kern ...

  4. python字典之defaultdict详解

    python字典之defaultdict详解 defaultdict为你的字典设定一个默认值或者默认值的数据类型: defaultdict接受一个工厂函数作为参数,如下来构造: dict =defau ...

  5. 哈夫曼树(霍夫曼树)-详解

    哈夫曼树(霍夫曼树)-详解 哈夫曼树(霍夫曼树)-详解 何为权值?我们看下百度百科的解释. 何为路径? 何为路径长度? 何为树的路径长度? 何为结点的带权路径长度? 何为树的带权路径长度(WPL)? ...

  6. 二叉树合集(二):霍夫曼树(图文详解)

    合集地址 二叉树合集(一):二叉树基础(含四种遍历,图文详解) 二叉树合集(二):霍夫曼树(图文详解) 二叉树合集(三):线索二叉树(图文详解) 二叉树合集(四):对称二叉树(递归和迭代实现) 二叉树 ...

  7. 数学规划详解(附例题及部分Python实现)

    数学规划详解(附例题及Python实现) 例题来自于清风老师的数学建模课,个人认为讲的非常好,欢迎大家购买 一.概述 1.1 定义 数学规划是运筹学的一个分支,在约束条件下,按照目标函数来寻求计划管理 ...

  8. 机器学习(六)树模型详解

    树模型详解 决策树 决策树模型 ① 树模型不用做scaling ② 树模型不太需要做离散化 ③ 用Xgboost等工具库,是不需要做缺失值填充 ④ 树模型是非线性模型,有非线性的表达能力 决策树基于& ...

  9. java斐波那契查找_详解Java Fibonacci Search斐波那契搜索算法代码实现

    一, 斐波那契搜索算法简述 斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术. 斐波那契搜索采用分而治之的方法,其中我们按照斐波那契数列对元素进行不均等 ...

最新文章

  1. 如何运行具有奇点的NGC深度学习容器
  2. Linux之压缩和解压缩命令
  3. python内置函数源码_python如何查看内置函数源码
  4. 如何更改已生成的APK的APP名字?
  5. 19-for循环语句
  6. /etc/fstab 参数详解及如何设置开机自动挂载
  7. 将一个数组里面的奇数全部排在前面,偶数排在后面
  8. 《SolidWorks 2017中文版机械设计从入门到精通)》——1.3 常用工具命令
  9. Tensorflow object detection API训练自己的目标检测模型 详细配置教程 (一)
  10. linux源代码分析和阅读工具比较
  11. 第一课 GoC简介和演示
  12. 思科 Cisco CCNA 题库、
  13. Alpha-Beta剪枝算法原理
  14. ppt如何替换其他mo ban_“华南师范大学”专属PPT模板来了!华南师大同学们的PPT我们承包了!...
  15. oracle死锁级别locked_mode
  16. java实现附件预览(openoffice+swftools+flexpaper)
  17. 【网络】网络层协议——IP
  18. 2021-04-06
  19. 数据库管理系统MySQL(一)
  20. 单相交流调压电路matlab仿真,单相斩控式交流调压电路

热门文章

  1. web渗透笔记之前期信息收集
  2. redis原理详细分析图解(最全的都在这里)
  3. 年轻人如何选择自己的工作机会
  4. 瓜子二手车封宇:瓜子IM智能客服系统数据架构设计
  5. 互联网女皇2013互联网趋势报告
  6. 如何把cad格式转换成jpg格式?快速把cad转jpg的方法
  7. win7 ghost 版 打开或关闭windows功能 ,如nfs 客户端 telnet 客户端 提示 并非所有的功能被成功更改
  8. iOS 8全系统苹果盘古完美越狱工具1.0.0版For Windows下载地址
  9. 如何用mysql对淘宝用户行为进行分析
  10. stm32CubeMX环境下完成流水灯的设计