字典树(基础学习)

背景和定义:

在算法导论中,Trie并不叫字典树,而是叫基数树,也就是说实际上并不是只是和字符串有关。字典树的构造结果如果说和字符串本身没有关系的话,实际上是一个N叉树。在这个N叉树上,如果是共父节点的N个子节点是有序 的,这样构造出来的树实际上就和字典树很像了。


言归正传,我们下面来讨论字典树。字典树的功能实际上是对于很多的串进行压缩,压缩的方法是根据这个字符串的前缀。具体来说,就是说每个字典树的节点将表示一个字符,用从根节点到叶子节点(也有可能是一个中间节 点,具体情况见实现情况)来表示一个字符串。


这样做的结果就是实际上压缩了所有模式串,随后在每一次的向下步骤中实际上因为前缀的合并,所以实际上是将前缀

进行了大规模的合并.从而大量的节省了时间.


构造:

我们直接看构造的方法可能更好理解一点.

按照我们前面的说法,首先是我们先加上一个struct的节点:

struct node
{
	node *nxt[26];
	int flag;
	node()
	{
		for(int i=0;i<26;i++)
		{
			nxt[i]=NULL;
		}
		flag=0;
	}
};

随后我们开始构造字典树,将字典树加在后面的叶子上面:

void ins (char *s)
{
	int len=strlen(s);
	node *now=root;//指向根节点
	for(int i=0;i<len;i++)
	{
		int to=s[i]-'a';
		if(now->nxt[to]==NULL)now->nxt[to]=new node();
		now=now->nxt[to];//now指向新生成的结点
	}
	now->flag++;//最后一个叶节点做标记  意思是这个字符串在这个结点结束
}

最后的匹配的结果就是按照root位置向后正常的走


接下里是一个简单的例题:hihocoder 1366


一些技巧和其他类型的问题:
1. 求最短的区别前缀(POJ 2001)
思路非常简单,只要在字典树上记录所有的节点的记录次数,这个时候只要查到一个次数只有1的时候就可以了。

poj2001题解



2. 空间不够导致RE的问题 (BZOJ 1174)
这个题没法交,大家YY吧
题意:给你一个字符集合,你从其中找出一些字符串出来. 希望你找出来的这些字符串的最长公共前缀*字符串的总个数最大化
这道题最要命的不是因为算法困难,而是空间开不下。考虑到我们的Trie本身也是一棵树,也就是说我们可以用建树的方法进行建树,而不是直接开好所有的内存和指针.

推荐博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
## 数组 - [1-1 动态扩容的数组](1.1_dynamicArray.py) - [1-2 大小固定的有序数组](1.2_orderArray.py) ## 链表 - [2-1 无序链表](2.1_unOrderList.py) - [2-2 有序链表](2.2_orderList.py) - [2-3 双向链表](2.3_biList.py) - 2-4 循环链表 - 2-5 链表反转 - 2-6 合并有序链表 - 2-7 链表中间节点 ## 栈 - 3-1 顺序栈 - 3-2 链式栈 - 3-3 最大栈 ## 队列 - 4-1 顺序队列 - 4-2 链式队列 - 4-3 循环队列 ## - [5-1 的基本操作](utils.py) - [5-2 二叉](5.2_binaryTree.py) - [5-3 二叉堆](5.3_binaryHeap.py) - [5-4 二叉搜索](5.4_binarySearchTree.py) - [5-5 平衡二叉](5.5_avlTree.py) - [5-6 红黑](5.6_rbTree.py) - [5-7 trie](5.7_trie.py) - [5-8 双数组字典树](5.8_datree.py) - [5-9 哈夫曼](5.9_huffmanTree.py) ## 图 - [6-1 图基础操作](6.1_networkx.py) - [6-2 广度优先搜索](6.2_bfs.py) - [6-3 深度优先搜索](6.3_dfs.py) - [6-4 prim](6.4_prim.py) - [6-5 kruskal](6.5_kruskal.py) - [6-6 Dijkstra](6.6_dijkstra.py) - [6-7 Floyd](6.7_floyd.py) - [6-8 拓扑排序](6.8_topologic.py) ## 搜索 - 7-1 顺序查找 - 7-2 二分查找 - 7-3 插值查找 - 7-4 斐波那契查找 - 7-5 稠密索引 - 7-6 分块索引 - 7-7 倒排索引 - 7-8 哈希 -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
*AI学习知识点* 1. 基础知识 概率论 微积分与逼近论 极限、微分、积分的基本概念 利用逼近的思想理解微积分,利用积分的方式理解概率论 概率论的基础 古典模型 常见的概率分布 大数定理和中心极限定理 协方差和相关系数 最大似然估计和最大后验估计 凸优化 凸优化的基本概念 凸函数 凸集 凸优化问题的标准形式 线性代数及矩阵 线性空间及线性变化 矩阵的基本概念 状态转移矩阵 特征向量 矩阵的相关乘法 矩阵的QR分解 对称矩阵、正交矩阵、正定矩阵 矩阵的SVD分解 矩阵的求导 矩阵的映射和投影 数据分析 常数e gini系数 导数 梯度 梯度下降 信息熵与组合数 Taylor 牛顿法 2. Python高级应用 容器 列表:list 元组:tuple 字典:dict 数组:Array 切片 列表推导式 浅拷贝和深拷贝 函数 lambda表达式 递归函数及递归优化 常用内置函数/高级函数 项目案例: 约瑟夫环问题 常用库 时间库 并发库 科学计算库 Matplotlib可视化会图库 锁和线程 多线程变成 3. 机器学习 机器学习 理论概述 督导学习 逻辑回归 Softmax分类 条件随机场 支持向量机svm 决策 随机森林 GBDT 集成学习 非督导学习 高斯混合模型 聚类 PCA 密度估计 LDA 双聚类 降维算法 LSI 数据处理与模型调优 特征提取 数据预处理 数据降维 模型参数调优 模型持久化 模型可视化 优化算法:坐标轴下降法和最小角回归法 数据挖掘关联规则算法 感激模型 4. 深度学习 迈入人工智能的大门 深度学习概述 感知器 BP神经网络 RBF神经网络 Tensorflow概述 Tensorflow常用api Tensorboard可视化技术 源码实现BP与RBF 机器能看的现代技术-CNN 初识CNN 模型优化技术 CNN经典模型 机器能读懂文字的技术-RNN 初识RNN 走进LSTM 机器能伪造数据的技术-GAN 走进GAN 损失函数原理解析 GAN变种 深度学习进阶 目标检测(ssd,yolo) seq2seq seq2seq with Attension 5. 自然语言处理 词 分词 词性标注 词向量 字向量 实体识别 关系抽取 关键词提取 无用词过滤 句 句法分析 语义分析 自然语言 理解 一阶逻辑 文本相似度计算 7. 图像处理 图像基础 图像读写、保存、画图 图像操作及算数运算 图像像素读取、算数运算、ROI区域读取 图像颜色空间运算 图像颜色空间相互转换 图像集合变化 平移、旋转、仿射变化、透视变化等 图像形态学 腐蚀、膨胀、开闭运算等 图像轮毂 长宽、面积、周长、外方园、方向、平均颜色、层次轮图 图像统计学 图像直方图 图像滤波 高斯滤波、均值滤波、双边滤波、拉普拉斯滤波 1. 基础知识 概率论 微积分与逼近论 极限、微分、积分的基本概念 利用逼近的思想理解微积分,利用积分的方式理解概率论 概率论的基础 古典模型 常见的概率分布 大数定理和中心极限定理 协方差和相关系数 最大似然估计和最大后验估计 凸优化 凸优化的基本概念 凸函数 凸集 凸优化问题的标准形式 线性代数及矩阵 线性空间及线性变化 矩阵的基本概念 状态转移矩阵 特征向量 矩阵的相关乘法 矩阵的QR分解 对称矩阵、正交矩阵、正定矩阵 矩阵的SVD分解 矩阵的求导 矩阵的映射和投影 数据分析 常数e gini系数 导数 梯度 梯度下降 信息熵与组合数 Taylor 牛顿法 2. Python高级应用 容器 列表:list 元组:tuple 字典:dict 数组:Array 切片 列表推导式 浅拷贝和深拷贝 函数 lambda表达式 递归函数及递归优化 常用内置函数/高级函数 项目案例: 约瑟夫环问题 常用库 时间库 并发库 科学计算库 Matplotlib可视化会图库 锁和线程 多线程变成 3. 机器学习 机器学习 理论概述 督导学习 逻辑回归 Softmax分类 条件随机场 支持向量机svm 决策 随机森林 GBDT 集成学习 非督导学习 高斯混合模型 聚类 PCA 密度估计 LDA 双聚类 降维算法 LSI 数据处理与模型调优 特征提取 数据预处理 数据降维 模型参数调优 模型持久化 模型可视化 优化算法:坐标轴下降法和最小角回归法 数据挖掘关联规则算法 感激模型 4. 深度学习 迈入人工智能的大门 深度学习概述 感知器 BP神经网络 RBF神经网络 Tensorflow概述 Tensorflow常用api Tensorboard可视化技术 源码实现BP与RBF 机器能看的现代技术-CNN 初识CNN 模型优化技术 CNN经典模型 机器能读懂文字的技术-RNN 初识RNN 走进LSTM 机器能伪造数据的技术-GAN 走进GAN 损失函数原理解析 GAN变种 深度学习进阶 目标检测(ssd,yolo) seq2seq seq2seq with Attension 5. 自然语言处理 词 分词 词性标注 词向量 字向量 实体识别 关系抽取 关键词提取 无用词过滤 句 句法分析 语义分析 自然语言 理解 一阶逻辑 文本相似度计算 7. 图像处理 图像基础 图像读写、保存、画图 图像操作及算数运算 图像像素读取、算数运算、ROI区域读取 图像颜色空间运算 图像颜色空间相互转换 图像集合变化 平移、旋转、仿射变化、透视变化等 图像形态学 腐蚀、膨胀、开闭运算等 图像轮毂 长宽、面积、周长、外方园、方向、平均颜色、层次轮图 图像统计学 图像直方图 图像滤波 高斯滤波、均值滤波、双边滤波、拉普拉斯滤波

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值