算法期末复习
lecture9
布隆过滤器
数组
对于存储元素
对于查询元素
假阳性概率
经过存储后特定位仍是
假阳性的概率:
优势
允许误报,则会节省哈希空间
数据经过哈希加密
插入和查询都是
局部敏感哈希LSH
LSH函数
LSH哈希族满足:
当距离小于一定阈值(相似)
当距离大于一定阈值(不相似)
SRP角度随机投影
LSH for Jaccard Similarity
复杂度分析
- 查询时间:
- 空间使用:
- 预处理时间:
漏报概率:
lecture10
相似文本查找
Shingling:将文本转化为集合
文本中长度为
MinHash:将大集合转换成短签名,同时保持相似性
签名:表示集合的短整数向量,并反映它们的相似性
- 将集合编码为
向量 - 找到相似的列,计算小签名,并保证签名的相似性==列的相似性
- 如果
很高, - 如果
很低,
- 如果
Min-Hashing:
随机交换
此后
保证了相似性:
一遍扫描压缩
1 | for r=0:1:m |
LSH:关注相似的文本
对于Min-Hash矩阵:
- 将签名矩阵M的列散列到许多桶中
- 哈希到同一桶中的每对文档都是候选对
使用函数f(x,y)来判断x和y是否是候选对
寻找具有Jaccard相似度至少为s的文档
将矩阵M划分为b个带,每带r行
- 对于每个带,将每列的一部分散列到一个有k个桶的哈希表,使k尽可能大
- 候选列对是那些散列到同一桶≥1个带的列对
- 调整b和r以捕获大多数相似对
漏检率:
误报率:
拐点:
lecture11图
简单路径:所有顶点和边都不同的路径
简单环:除了
无环连通无向图图称为树
有向无环图:
DFS
时间复杂度
- 邻接表:
- 邻接矩阵:
括号引理
祖孙关系可由
边的类型
-
tree边:DFS树中的边
-
forward边:(u, v),其中v是树中u的后代
-
back边:(u, v),其中v是树中u的祖先。
-
cross边:(u, v)其中u和v不是彼此的祖先或后代
DFS可以检测有向图中是否含有圈
强连通分量SCC
有向图G=(V,E)是强连通的,如果对于每个顶点u和v都有一条从u到v的路径和一条从v到u的路径。
DFS检测强连通分量:
- 生成反向图
- 将结束时间排序
- 选择结束时间最大的点开始
DFS森林的每一个子树都是强连通分量
高阶图的连通性
- 桥边:去除后会导致图不连通的边
边连通:不包含桥边的图 - 割点:移除会导致图不连通的顶点
- 重连通:不包含割点的图
寻找桥边
定义low[u]=min(d[u],min{d[w]:对于back边(v,w),其中v是u的后代})
即u的后代v,v的所有back边连接的祖先w中d[w]最小的,再和d[u]比较大小,较小者为low[u]
先经过DFS标好low值后:
1 | for each (v in V) { |
即to点的d值和low值相等的边
寻找割点
先经过DFS标好low值后:
1 | for each (u,v) { |
BFS
与DFS相同,BFS的时间复杂度也为
BFS应用
-
寻找最短路径
-
检验二部图
- 用交替的颜色给BFS树的层次上色
- 如果没有两个相邻节点的颜色相同,那么它就是二分的。
- 否则,就不是。
-
(循环论证)如果有两个相邻节点的颜色相同,则图中存在一个奇长度的圈。但是你永远不能用两种颜色给一个奇圈上色,因此不会有两个相邻节点的颜色相同。
lecture12贪心
背包问题
贪心算法并不奏效,但可以用DP解决
贪心算法适用的前提
-
局部最优解能到导致产生全局最优解
-
每次贪心选择能将所求问题简化为规模更小的子问题
-
是否有贪心选择性质
贪心选择性质:在每一步选择中,都能够选择一个局部最优解,而这个选择不会对剩余的问题产生负面影响。
最优子结构性质:通过解决子问题的最优解,可以构建出原问题的最优解
最优贪心算法设计:
-
分析问题的子结构性质
-
设计一种局部最优的贪心机制
-
给出贪心算法
-
分析算法复杂度
-
证明算法正确性
-
分析证明此贪心机制是否产生全局最优方案
贪心算法最优性证明的通用框架:
- 我们首先考虑任意一个最优解。
- 如果它等于贪心解,那么贪心解是最优的。
- 否则,我们考虑这两个解决方案不同的第一个实例。
- 我们用贪心的选择取代了最优选择后,证明事情只会变得更好。
- 因此,通过归纳应用这个论证,可以得出贪心解和最优解一样好,因此它是最优的。
活动选择调度
已知一个集合R有n个活动。
每个活动都有一个给定的开始时间si和一个给定的结束时间fi。
如果两个请求i和j的开始结束间隔重叠,则它们会冲突
试确定由相互不冲突的请求组成的基数最大的R的子集。
局部最优解:在尽早的时间里完成尽多的活动
1 | greedyIntervalSchedule(s, f) { |
时间复杂度:排序
正确性证明:不会出现有冲突的两个活动
最优性证明:
令
令
若
否则,由于
假设第一个二者不同的活动索引为
根据我们的贪心策略,
所以在
通过重复这个过程,我们将最终在不减少活动数量的情况下将
迟到惩罚最小化调度
任务
任务
策略:尽早完成
证明:
我们已经证明了:当
还是先考虑一个最优解,考虑贪心解中第一个与最优解所调度的工作不同的为工作
根据我们的贪心策略,当前
假设最优解中
我们继续在最优解中向前交换工作
通过反复修改最优解,最终我们会将其修改成贪心解,且修改过程中不会增加总成本,因此是最优的。
间隔分区
给定活动,我们希望使用最少数量的资源来调度所有活动。
我们得到
目标是找到最小的数
分析:
我们可以把它看成一个上色问题
我们希望为活动分配颜色,这样两个冲突的活动必须具有不同的颜色。
我们的目标是找到最小数量的颜色,这样就可以用这种方式为每个活动上色。
方法:
着色问题很难有效解决。
由于区间的简单性质,可以通过简单的贪心方法非常有效地解决区间划分问题。
首先,我们按开始时间对请求进行升序排序。
然后我们为每个请求分配最小的颜色(可能是一个新颜色),这样它就不会与该颜色类的其他请求冲突。
算法:
1 | greedyIntervalPartition(s, f) { |
时间复杂度
正确性证明:
该算法从不为两个冲突的活动分配相同的颜色。因此,该算法产生一个有效的着色。
最优性证明:
定义depth(t)
,depth(t)
表示开始时间到结束时间之间包含
给定一组R的活动请求,定义depth(R)
为对于depth(t)
最大的。
定理:针对原问题,需要的最小资源数depth(R)
。
继续证明:
不失一般性,假设所有的开始和结束时间是不同的。
我们证明的目的是:若贪心分配了
若颜色
所有这些不相容是由早于
因此
由颜色数量
最小化最大延迟
有
同一时间只能执行一个任务,目标是调度任务,使得所有任务中的最大延迟最小。
定义第i个任务的完成时间为fi,第i个任务的延迟时间为
定义最大延迟时间
贪心策略:Earliest Deadline First (EDF)策略
证明:
设
如果
否则,考虑
即
在
若两个任务的ddl都足够,则交换前后的延迟时间都是0,延迟不变。
否则,交换后会减小两个任务的延迟时间。所以交换后最大延迟时间至少不会增加。
不断在
每次交换,最大延迟时间不会增加,且最终也会变成
霍夫曼编码
统计字符
选择字符池中频率最低的两个字符合并,新字符的概率为二者频率之和,将新字符扔进字符池。
不断重复上述操作,直到字符池为空。
根据合并过程,我们可以构建出一棵霍夫曼树。
从叶节点向上标注编码长度,同一层的编码长度相等,且由同一层节点个数和下一层的编码长度决定,即
lecture13动态规划
动态规划
分治和贪心的子问题不重叠,动态规划子问题通常重叠
上讲中的区间调度问题,每个活动的权重都是相同的,若给每个活动赋予不同的权重,就不能简单的通过dll优先进行调度了。
方法:
将所有活动按结束时间
定义
定义
如果没有调度活动,则
考虑活动
若
若
令
空间换时间:
保存一个前导指针
生成调度活动:
1 | get-schedule() { |
时间复杂度
最长公共子序列
序列
定义
若
若
时间复杂度:填满
链式矩阵乘法
给定一个矩阵序列
定义
定义
有
由于递归依赖关系,先计算长度为
无限背包问题
所有物品的数量没有上限
一共有
物品
定义
则
时间复杂度
创建一个集合数组
最终
lecture14动态规划2
0-1背包问题
所有物品都有只有1个
一共有
物品
定义
有
若前
若前
则
1 | Zero-One-Knapsack(W, n, w, v): |
时间复杂度:
最大独立集
独立集:顶点的集合,它们之间没有边
最大独立集:顶点上有权重的图,权重最大的独立集
这是一个NP-complete问题
但我们可以假设这个图是一棵树,我们的问题变为在树中寻找最大独立集。
定义
若当前的树根在最大独立集中,那么他的两个孩子就肯定不在,继续考虑他孩子的孩子。
若当前树根不在最大独立集中,则考虑他的两个孩子。
则$A[u]=\max{$
可以再维护一个
则
如果
Floyd-Warshall算法
任意两顶点之间的最短路径(不同于Dijkstra的固定起点)
时间复杂度
NP困难问题
-
P:有一个多项式时间算法来解决的决策问题
- 对于X的所有实例s,如果s是一个YES实例, A(s) = YES,则算法A解决了问题X
- 如果对于每个实例s, A(s)最多以多项式(|s|)步结束,则A以多项式时间运行。
-
NP:存在多项式时间的证明的决策问题。
- 算法C(s,t)证明问题X,如果对于每个YES实例s,存在一个证据t使得C(s,t) = YES,并且|t| = 多项式(|s|)。
-
EXP:有指数时间算法的决策问题
-
, -
NP-hard:对于问题Y,任意NP问题X,都满足
,则Y是NP-hard问题。 - 哈密尔顿图是NP-complete问题
-
NP-complete(NPC):在NP中的NP-hard问题。
- Title: 算法期末复习
- Author: KK
- Created at : 2023-06-23 10:29:28
- Updated at : 2023-11-22 00:27:23
- Link: https://yukun-cui.github.io/archives/算法期末复习/
- License: This work is licensed under CC BY-NC-SA 4.0.