0%

数据结构期末复习

时间复杂度

平均时间复杂度:典型情况性能Θ\Theta

最坏时间复杂度:最坏情况性能OO

分治

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]dp[i][j]表示前ii个物品一共消耗了jj容量的最大价值,只需要考虑第ii个物品取或者不取 进一步优化(背包问题的核心思想):每一个物品只能取一次 用dp[i]dp[i]表示消耗容量ii的情况下获取的最大价值,仍然遍历物品,但是在转移时,直接从CmaxC_{max}转移到CminC_{min},不会出现取多次的情况
完全背包 每个物品变为无数个,01背包转移的时候枚举数量。
双背包 背包变为2个,转移的时候将容量扩展一维,都从大到小遍历即可。
多重背包 每种物品有sis_i种 朴素想法:直接转化为01背包来做 优化:做一个把每一个sis_i转化成二进制的形式,二进制的每一位变成一种。
# 搜索 ## 搜索 ### 深度优先 ### 广度优先 ### 迭代加深 逐渐增加允许搜索的深度,找到最浅完备解,防止死循环 ### 一致代价搜索 优先扩展当前路径代价最小的点(很容易联想到Dijkstra) ## 启发式搜索 启发函数h(n)要保证估计成本不能高于实际成本 ### 贪心最佳优先搜索 考虑一个函数h(n)来评估预计n到目的点的距离,每次走n最小的 不保证最优解,而且有可能绕路 ### A*算法 考虑一个函数f(n)=g(n)+h(n)f(n)=g(n)+h(n)来评估,g(n)g(n)表示当前已经花费的探索成本,由此来取得一个平衡 能够保证最优解,但是空间复杂度非常吓人 ## Online Algorithms ### ALG/OPT ALG表示在线算法的性能 OPT表示离线算法的性能 ### 竞争比(Competitive Ratio) 竞争比是衡量在线算法性能的重要指标,用于比较在线算法与最优离线算法的结果。 #### **定义** 对于一个在线算法 ALG\text{ALG},其竞争比定义为: CR=supIALG(I)OPT(I)(对于收益最大化问题)CR = \sup_I \frac{\text{ALG}(I)}{\text{OPT}(I)} \quad \text{(对于收益最大化问题)}

其中:CR1CR \geq 1,竞争比越接近 1,在线算法的性能越接近最优离线算法。

  • 问题描述
    • 每天可以选择租滑雪板(每天花费$ 10)或直接购买滑雪板(一次性花费 100)。100)。 - 问题是你不知道总共需要滑雪多少天。
  • 分析
    • ALG:在线算法的策略,租到第 10 天时购买。
    • OPT:最优离线算法的策略,知道总天数 n,如果 n10n \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中

哈密顿回路问题:无向图中判断是否存在一条回路,经过每个顶点一次且仅一次,最终回到起点

子集和问题:判断是否存在一个子集,子集中的元素和等于一个给定值