2022-01-25

1.字符串匹配BM算法

在文本中查找字符串匹配算法,坏字符串规则和好后缀规则
坏字符串规则:

image.png

从后往前匹配,第一个不匹配的字符叫做坏字符。如果本次不匹配,下次匹配下滑的位数为Si-Xi。S是第一个不匹配字符在查找串的位置。Xi是坏字符在查找串靠后的一个,如果不存在Xi=-1。Si-Xi可能为负数,比如字符串为aaaaaaaa,查找串为baaaa,那么Si=0,Xi=1。
好后缀规则:
image.png

字符串从后往前匹配,遇到第一个坏字符串,如果位置从后往前数第三位,好后缀为后2位。这时候查看bc在查找字符串中是否还有靠后的另外一个匹配,示例中是u,这个时候将字符串滑动N位,让u与u对齐。如果查找不到,查找串头部与u匹配最长子串,如下图是一位c。
image.png

2.字符串匹配KMP算法

image.png

--
字符串从前往后匹配,遇到第一个坏字符,位置为j。查找好前缀里面最长后缀子串(这个子串与查找字符串里面的前缀子串匹配),假设这个子串长度为k,那么字符串滑动位数为j-k

3.Trie树(字典树,前缀树)

搜索引擎提示是怎么实现的呢,比如输入h提示her,hello等。


image.png

节点如何存储下游节点数据,假设只有26个字符,节点定义如下:
Class TrieNode {
char data;
TrieNode children[26];
}
children[0]放值为a的子节点,以此类推。 通过下标与子节点固定的模式存储。 缺点,浪费内存

4.AC自动机

一般网站留言都有敏感词过滤,替换成***,是怎么实现的呢
敏感词构建成一棵Trie树,需要查找敏感词的文本从第一个字符开始在Trie树中匹配,到最后一个不匹配的字符(不是敏感字符)或者到叶子节点(是敏感字符)结束。然后从下一个位置开始匹配。如何加快这个匹配速度,需要构建一个快速挪到的算法,这个没看懂,构建好之后就是AC自动机了。

5.贪心算法

一组数据,定义了限制值和期望值,选出一些数据,满足限制值的情况下,期望值最大。比如限制背包是100kg,挑选各种豆子最后豆子金额最大。
霍夫曼编码压缩原理:1000个字符的文件,如何压缩空间最小。 这个限制值是1000,期望值是空间最小。1000个字符串正常是8000空间,因为一个字符是8位,假设这1000个字符串只包含6个字符,其实一个字符用3位表示即可。现在要先找出有多少字符和每个字符有多少个。最多的字符用1位表示1,第二多字符用2位表示01,第三多字符用3位001表示,依次类推。保证每一个都不是另外一个的前缀,依次保证翻译不会冲突。

6.分治算法

用分治算法满足的条件:子问题和原问题有相同的模式,子问题可以独立求解,具有终止条件(问题足够小可以直接求解),可以把子问题合并成原问题且合并代价不高

7. 回溯算法

0-1背包问题,正则匹配


image.png

8.动态规划

我们把问题分解为多个阶段,每个阶段对应一个决策。我们记录每一个阶段可达的状态集合(去掉重复的),然后通过当前阶段的状态集合,来推导下一个阶段的状态集合,动态地往前推进
0-1背包问题,0-1背包升级版
理论:
一个模型三个特征
模型:多阶段决策最佳解模型,动态模型一般用于解决最优解问题,而解决问题的过程,需要经历多个决策阶段。每个决策阶段对应一组状态,我们寻找一组决策序列,经过这组决策序列可以产生期望的最优解
三个特征:
1.最优子结构:问题最优解包含子问题最优解,后面的状态可以通过前面的状态推导出来
2.无后效性:推导某一个阶段状态只关心前一个阶段的状态,某阶段状态确定后,后续阶段不影响本阶段的状态
3.重复子问题
不同决策序列,到达相同阶段会产生重复的状态。

9.

你可能感兴趣的:(2022-01-25)