带自己学/复习算法
文章平均质量分 54
HITNLATE
这个作者很懒,什么都没留下…
展开
-
[带自己学/复习算法] 5.KMP
KMP的核心是部分匹配数组π\piπ 部分匹配数组π\piπ定义为,π[i]\pi[i]π[i]代表子字符串p[0,i]p[0, i]p[0,i]的前后缀最大匹配值,如下所示: 比如"ABCAB",那么此时π\piπ值为222,因为最大匹配前后缀为"AB" 下标 0 1 2 3 4 5 模式串 A B C A B D 匹配值 0 0 0 1 2 0 而KMP算法就是在当前不匹配时,利用前后缀匹配信息,转移到它前面看是否匹配,节省了从头再来的复杂度。 举个例子: I | 目标串 .原创 2022-04-22 15:34:03 · 289 阅读 · 0 评论 -
[带自己学/复习算法] 4.博弈论之SG函数
先手必胜态(N:now win)和先手必败态(P:previous win)是博弈论中很重要的概念。 我们可以通过状态间的转移来进行推理当前状态究竟是NNN还是PPP,以一个简单的Bash博弈例子为例: 有一堆石子数量为nnn,每次可以取1−m1-m1−m个石子,双方轮流取,直到不能取者输,那么问你是否当前先手必胜? 这个问题的经典做法是从最终结果反推,我们记(number, status)为当前有number的石子,先手处于N/P状态。我们从状态(0, P)开始反推,可以知道(1)到(m)一定是状态N,即原创 2022-04-21 21:11:11 · 209 阅读 · 0 评论 -
[带自己学/复习算法] 3.SkipList
跳表 SkipList 最近在准备面试,看到了Redis中用到的一种数据结构:跳表。它主要的思想就是用多层链表,并且越高层的链表结点数越少,这样可以在高层快速跳跃免去不必要的查找,在底层使用精细查找。 举一个例子: [1, 5 9 ] # 高层 [1, 3, 5, 7, 9 ] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 底层 我们如果要找6的话,首先可以在高层快速跳跃,免去1-5的遍历,直接从1跳到5,然后原创 2022-04-08 22:29:58 · 391 阅读 · 0 评论 -
[带自己学/复习算法] 2.Manacher
Manacher Manacher算法主要与回文串问题相关,能够求得以 iii 为下标的回文串半径 dp[i]dp[i]dp[i],它相对于普通暴力算法的最关键点就是对 回文半径的初始化(重点)不仅仅是一开始为1,而是可能从之前算出来的结果中转移,而本文也将对其介绍。 1 算法的重点 - 半径初始化 及 分类讨论 首先解释一下上面的各个变量含义 i : 当前遍历到的下标 i,由于是从左往右遍历的,此时 [0, i - 1] 的回文串都已经求出了。 R : 当前最右边界,这一项的设置是为了保证算法的O(n)原创 2021-03-26 22:52:39 · 86 阅读 · 0 评论 -
[带自己学/复习算法] 1.单调栈
单调栈 单调栈是一种特殊的栈,其栈内元素共有4种情况:单调增、减、不增、不减。 其常与一个经典问题相联系使用:专注于一个数组中的第 iii 个元素,找左右两边第一个小 于、大于、不小于、不大于的元素下标和值。 以一个常见的问题举例:柱状图中最大的矩形 看到问题首先进行分析,面积由长 * 宽两部分计算,而宽显然是 h[i]h[i]h[i],长也显然是两端能延伸的最大长度。很容易想到这与找一个元素左右第一个小于的下标等价。 下面给出代码中单调栈的实现及解释: # 仅为部分代码,只实现了找左侧第一个小于的元素 #原创 2021-03-21 20:09:02 · 70 阅读 · 0 评论