Logo
Overview

算法设计与分析 复习笔记

June 4, 2025

1.

没东西

2.引言

算法:确定性,能行性,输入,输出,有穷性。

O,Θ,Ω:

O:上界:从某个值之后都大于

Ω:下界:从某个值之后都小于

Θ:上界和下界中间值。

3.递归

4.分治

  • 一般方法(DANDC)

分割,治理,合并。

SMALL:规模合适?直接求解:继续分

DIVIDE:分割。

COMBINE合并。

时间:自己推吧

  • 二分查找

1-n => 1- mid-1, mid -mid , mid +1 - n 复杂度:logn,两种写法?(递归,循环)

binart search tree:

还有三分。

  • 归并排序

先分到1,然后合并的时候治理。把后半段和前半段交错着放进数组。

比较为基础时间下界:nlogn。

  • 矩阵乘法

n *n矩阵乘法 => 七个子(n/2 * n/2)矩阵的乘法

  • 二维极大点(极大点:没有被支配(存在x比他小,y比他小的点))

先(按x或者y)排序,分。对子集=1:本身就是极大点。‘

合并:如果左边/右边子集的极大点,如果yL < yR,丢弃点L

  • 主定理....?感觉不需要记住?

5.贪心

  • 一般方法

局部最优组成全局最优。

SELECT:选择当前最优

FEASIBLE:当前最优可否加入解?

UNION:添加到解。

  • 分数背包(p,价值,w,重量)

pi/wi 从大到小,然后能取完就取完,不能取完就取部分。

证明:

  • 作业调度

就是接水吧。n个作业,有截止时间和收益。找到最大收益的做法。

(收益)排序。尽可能靠后地解决收益小的问题。

证明。。TODO()

可行调度证明:TODO()

基于插入的贪心算法?

收益排序,维护截止时间递增序列。

集合树。并查集。维护当前时间(以及之前 )是否

  • 最小生成树

kruskal =》 图变树。

从一个点开始,他的下一个点如果不在树中,扩张这条边。

  • 货郎担...?

经过所有城市一次的最短路。对每个点选择最短的边?不能找到最优解!!

6.动规

  • 一般方法TODO:最优性原理证明。

多段决策,最优性原理

  • 多段图

最短路?分阶段最短路。

(向前递推)COST(i,j)表示从Vi中点j到终点t的最短路径。

COST(i,j)=min{c(j,l)+COST(i+1,l)},l是下一个阶段的点。

(向后递推)COST(i,j)表示从起点s到Vi中点j的最短路径(嗯所以是一样的东西。)

COST(i,j)=min{c(l,j)+COST(i-1,l)},l是上一个阶段的点。

  • 货郎担问题

找到图中一条路径(环),恰好经过每个点一次,且长度最短。

g(i,S)表示,从节点i开始,通过S中所有节点,到达节点1的最短路径长度。

g(1,V-{1})是结论。

g(1,V-{1})=min(c(1,k)+g(k,V-{1,k}))。于是有递推式子。

g(i,空)=ci1

g(i,S)=min(c(1,k)+g(i,S-{k}))

复杂度:n^2* 2^n

  • 01背包

维护在前i个物品中,重量为j的情况下能获得的最大价值。时间复杂度(O(nm),空间同样)

F(i,j)=max(F(i-1,j),F(i-1,j-w)+p)

状态压缩。为O(W)只需要保存当前行和上一行的数据。

序偶对法

维护(背包价值,背包重量)的列表。去重,取最大价值且重量为M的二元组。(状态最多2^N)种,可以通过筛选(合法化,去重)减少。时间复杂度(在每次状态扩张时都会翻倍!呜呜呜呜呜可恶啊)

  • 可靠性设计

在最大成本c下,流水线的可靠性最大化。流水线中,每种设备最少一台,有成本限制。0n背包。

  • 最优二分检索树(复杂度On^3)

左子树/右子树分别大于,小于父节点。

最优二分检索树:最小化查询次数。TODO

  • 矩阵链乘积:TODO

7.回溯

需要求组合,并且需要回顾先前情况。多米诺性质:在得到某个状态不成立后,后面的情况都可以不考虑了。(剪枝)

扩展节点

  • 子集和

给出n个整数和M。要找出所有子集,其和为M。

可以转成?固定长元组表示(xi)xi = 0或1,解空间:2^n。(换种表达是,求出一个解向量和原始向量的点乘为M)。

约束函数:大于M不考虑。

  • n皇后。。。

满足任意两个皇后不存在在(同一行,同一列,同一对角线上)

考虑每一行的皇后,可以放在第i行的1-n列。从而,可以进行回溯搜索。约束:行-列不同,行+列不同。可以压缩棋盘到一维。

  • 图着色问题

相邻不同色。

8. 分支限制界法

也许算是一种奇怪的剪枝...?

  • 一般方法

扩展节点方法不同(回溯变种)

没结束时:对于所有儿子节点,判断约束,满足添加到活结点列表。选取,迭代。(类似BFS的queue?)

如果用的queue做为列表,那么叫FIFO检索。如果用priority queue,LC检索。(优化的dijkstra)

  • LC检索

优先级:C最小成本值。(深度?)

  • 15-谜问题

十六个格子15个块。移动到有序状态。

  • 最小成本
  • 作业调度
  • 货郎担

9.NP完全?

多项式时间算法是好算法(对比,指数级别)

可以在多项式时间内解决的判定问题是P

可以在多项式时间内用不确定算法验证的判定问题:NP。

所有的P都是NP问题。

NPC问题:所有的NP问题能通过一个多项式时间算法转换为某个NP完全问题。

任何 NP问题都可以在多项式时间内转化为为可满足性问题。可满足性在P内,当且仅当P=NP

comment

留言 / 评论

如果暂时没有看到评论,请点击下方按钮重新加载。