时间复杂度
平均时间复杂度:典型情况性能$\Theta$
最坏时间复杂度:最坏情况性能$O$
分治
Merge Sort
MinMax Problem
二分答案+验证可行性,题目中一般有关键信息:某个值Val越大越容易使某种情况成立,求某种情况成立的最小的Val
Closeset Pair Problem
给定一个平面,有n个已知坐标的点,求最近的点对。
朴素想法1:根据x坐标进行二分,有了朴素想法1之后看到难点:怎么在n的复杂度内考虑完跨越边界的点
朴素想法2:根据两边已经产生的答案来进行一个限制,x和y同时限制之后,对于每个点只需要枚举不超过7个点
Convex Hull Problem
平面上有n个已知坐标的点,求他们的凸包
根据x坐标进行二分,合并的时候找上边的共线(斜率一样)和下边的共线,然后进行合并
DP
LCS
Knapsack
01背包
1个背包,给定容量,放价值最大的东西
$dp[i][j]$表示前$i$个物品一共消耗了$j$容量的最大价值,只需要考虑第$i$个物品取或者不取
进一步优化(背包问题的核心思想):每一个物品只能取一次
用$dp[i]$表示消耗容量$i$的情况下获取的最大价值,仍然遍历物品,但是在转移时,直接从$C_{max}$转移到$C_{min}$,不会出现取多次的情况
完全背包
每个物品变为无数个,01背包转移的时候枚举数量。
双背包
背包变为2个,转移的时候将容量扩展一维,都从大到小遍历即可。
多重背包
每种物品有$s_i$种
朴素想法:直接转化为01背包来做
优化:做一个把每一个$s_i$转化成二进制的形式,二进制的每一位变成一种。
搜索
搜索
深度优先
广度优先
迭代加深
逐渐增加允许搜索的深度,找到最浅完备解,防止死循环
一致代价搜索
优先扩展当前路径代价最小的点(很容易联想到Dijkstra)
启发式搜索
启发函数h(n)要保证估计成本不能高于实际成本
贪心最佳优先搜索
考虑一个函数h(n)来评估预计n到目的点的距离,每次走n最小的
不保证最优解,而且有可能绕路
A*算法
考虑一个函数$f(n)=g(n)+h(n)$来评估,$g(n)$表示当前已经花费的探索成本,由此来取得一个平衡
能够保证最优解,但是空间复杂度非常吓人
Online Algorithms
ALG/OPT
ALG表示在线算法的性能
OPT表示离线算法的性能
竞争比(Competitive Ratio)
竞争比是衡量在线算法性能的重要指标,用于比较在线算法与最优离线算法的结果。
定义
对于一个在线算法 $\text{ALG}$,其竞争比定义为:
$CR = \sup_I \frac{\text{ALG}(I)}{\text{OPT}(I)} \quad \text{(对于收益最大化问题)}$
其中:$CR \geq 1$,竞争比越接近 1,在线算法的性能越接近最优离线算法。
- 问题描述:
- 每天可以选择租滑雪板(每天花费$ 10)或直接购买滑雪板(一次性花费 $100)。
- 问题是你不知道总共需要滑雪多少天。
- 分析:
- ALG:在线算法的策略,租到第 10 天时购买。
- OPT:最优离线算法的策略,知道总天数 n,如果 $n \geq 10$,直接购买,否则每天租用。
在线缓存问题(Caching Problem)
- 问题描述
- 有一个容量为 k 的缓存,用于存储最近访问的 k 个数据。
- 数据访问请求是按序列到达的,如果请求的数据不在缓存中(缓存未命中),需要替换一个缓存数据。
- 分析
- ALG:在线算法的缓存替换策略, LRU(最近最少使用) 或 FIFO(先进先出)。
- OPT:离线算法知道所有未来请求序列,能够选择最优替换策略(通常是 Belady 算法)。
- 竞争比
- 在线缓存替换算法的竞争比一般为CR = O(k)。
NP-Completeness
P和NP
P是可以在多项式时间复杂度内由确定性算法解决的问题
NP是可以在多项式时间复杂度内验证解正确性的问题
NP-Complete问题
属于NP,而且是NP中最难得问题
如果某个NP完全问题能够在多项式时间内解决,则所有NP问题都可以在多项式时间内解决
NP-Hard
至少与NP完全问题一样难,但是不一定是NP类问题
常见NP完全问题
SAT和3-SAT:布尔公式赋值
旅行商问题:带权图中寻找经过所有城市一次且仅一次的最小总权重
定点覆盖问题:判断是否存在一个大小为k的定点集合,使得每一条边都至少一个端点在S中
哈密顿回路问题:无向图中判断是否存在一条回路,经过每个顶点一次且仅一次,最终回到起点
子集和问题:判断是否存在一个子集,子集中的元素和等于一个给定值