时间复杂度
平均时间复杂度:典型情况性能
最坏时间复杂度:最坏情况性能
分治
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个背包,给定容量,放价值最大的东西
表示前个物品一共消耗了容量的最大价值,只需要考虑第个物品取或者不取 进一步优化(背包问题的核心思想):每一个物品只能取一次 用表示消耗容量的情况下获取的最大价值,仍然遍历物品,但是在转移时,直接从转移到,不会出现取多次的情况完全背包 每个物品变为无数个,01背包转移的时候枚举数量。
双背包 背包变为2个,转移的时候将容量扩展一维,都从大到小遍历即可。
多重背包 每种物品有种 朴素想法:直接转化为01背包来做 优化:做一个把每一个转化成二进制的形式,二进制的每一位变成一种。
# 搜索 ## 搜索 ### 深度优先 ### 广度优先 ### 迭代加深 逐渐增加允许搜索的深度,找到最浅完备解,防止死循环 ### 一致代价搜索 优先扩展当前路径代价最小的点(很容易联想到Dijkstra) ## 启发式搜索 启发函数h(n)要保证估计成本不能高于实际成本 ### 贪心最佳优先搜索 考虑一个函数h(n)来评估预计n到目的点的距离,每次走n最小的 不保证最优解,而且有可能绕路 ### A*算法 考虑一个函数来评估,表示当前已经花费的探索成本,由此来取得一个平衡 能够保证最优解,但是空间复杂度非常吓人 ## Online Algorithms ### ALG/OPT ALG表示在线算法的性能 OPT表示离线算法的性能 ### 竞争比(Competitive Ratio) 竞争比是衡量在线算法性能的重要指标,用于比较在线算法与最优离线算法的结果。 #### **定义** 对于一个在线算法 ,其竞争比定义为:
其中:,竞争比越接近 1,在线算法的性能越接近最优离线算法。
- 问题描述:
- 每天可以选择租滑雪板(每天花费$ 10)或直接购买滑雪板(一次性花费 - 问题是你不知道总共需要滑雪多少天。
- 分析:
- ALG:在线算法的策略,租到第 10 天时购买。
- OPT:最优离线算法的策略,知道总天数 n,如果 ,直接购买,否则每天租用。
在线缓存问题(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中
哈密顿回路问题:无向图中判断是否存在一条回路,经过每个顶点一次且仅一次,最终回到起点
子集和问题:判断是否存在一个子集,子集中的元素和等于一个给定值