Skip to content

Lesson11:近似算法

相对高效地得到近似解。

alt text

得到了一个近似比,是与规模相关的。

alt text

时间复杂度也是希望与近似比成多项式关系。

举例:装箱子问题。

  • 在线算法:面对一个物品,立刻做决策。这是不能回溯的。
  • 离线算法:全部看完了再做决策

在线算法难以利用算法来对抗数据分布模式。

alt text

对于所有的在线算法,装箱问题的近似比不可能小于\(\frac{5}{3}\)

离线算法处理箱子问题,我们可以注意到主要的trouble maker来自大物块。

因此我们不妨先把他们从高到低排个序。

又举例:背包问题

alt text

非常显而易见的算法就是计算出一个"性价比",然后从高到低填入。

0-1背包:NPC问题

物品不能切割。

性价比排序还能得到最优解吗?

alt text

实际我们的算法是两个都试看看,也就是老师说的"混合贪心"。

alt text

重点在于理解整个算法,可分割意味着只有选择放入的物品中利润密度最低的(假设不小于2个)被分割。

那么我们讨论动态规划,状态转移方程可以这么写:

\[ F[N][M] = \max \{ F[N-1][M], F[N-1][M-w_i] + v_i \} \]

这理解应该简单,N就是考虑到的物品编号,M是剩余体积。

alt text

这里的\(O(N^2P_{max})\)并不代表该问题是成n多项式关系,由于\(p_{max}\)并不直接代表问题规模,我们把它换成"存储问题的比特/位数"才比较合理,因此\(p_{max}\)实际是一个2的幂次复杂度。

alt text

使得算法算的快一点,但是得到的已经是近似解了。

K中心点问题

给定n个点,然后要找出k个点,使得所有点与最近中心点的距离之和最小。

最大边际效应贪心

先放一个,求最小;

然后再放一个,使得减少尽可能多...

2r算法

从第一个算法发现,或者说本身这个问题,难点就在于点的"无限"位置。

alt text

我们假设圆心一定是在给定的点上面的,这样你的算法近似比不会大于2(因为对于我们所谓的圆内,点之间的距离不会大于2)可以证明就算是使用随机也不会大于2。

然而我们是不知道这个我们"给定"的r的,可以使用二分来解决。

"好的圆"算法

追求覆盖面积更小的圆,这是在2r算法的基础上的。

可以证明不大能获得2往下的近似比。

作业

alt text

FPTAS算法是那些时间复杂度符合\(O(n^{O(1)}(\frac{1}{\epsilon})^{O(1)})\)的算法。

alt text

虽然\(3^{\epsilon}\)看起来很恐怖,但是实际是个定值(笑),看到\(n^2\)是个多项式时间复杂度就对了。