WC2017 Day3

近似算法

0x00 提纲

  • 为什么需要近似算法
  • 近似算法简介
  • 总结

0x01 为什么需要近似算法?

  • 这一部分都在胡扯

算法的特点

  • 复杂度(时间,空间)
  • 正确性(方法正确性,程序正确性)
  • 简单性(程序结构简单,便于调试)

如何评价时间复杂度?

  • 对于给定问题,执行的基本运算次数
  • 基本运算选择(比较,加减乘除,置指针)
  • W(n) 最坏复杂度(Worst)
  • A(n) 平均复杂度(Average)

我们的需求?

  • 保证复杂度的前提下使算法尽量简单

基于时间的最优性

  • 最坏情况下最优
  • 平均情况下最优

算法最优?

  • 算法复杂度上界与问题复杂度下界相等

如何求问题复杂度下界?

  • 问题的输入输出规模(平凡下界)
  • 数学推导

如何求算法复杂度上界?

  • 瞎搞一个算法,直接计算基本运算次数
  • 显然你瞎搞出来的任何一个正确的算法都是一个上界

P,NP

  • P:时间复杂度与输入规模多项式相关,存在多项式时间算法
  • NP:不存在多项式时间算法(指数,阶乘)

判定问题

  • 答案只有是和否
  • 01背包的判定问题?
  • 搜索问题,组合优化问题和对应的判定问题

P类与NP类问题

  • P类:多项式时间内可解的判定问题
  • NP类:多项式时间内可验证的判定问题

多项式时间转换

  • 两个问题的答案可以在多项式时间内相互转化

0X02 为什么需要近似算法?

  • 有一些问题我们不知道有没有多项式时间算法
  • 我们需要近似算法来找到一个较优解
  • 较优解和最优解的比值r
  • 如果r为常数,称为常数近似比算法
  • 光对着PPT读是不是不太合适

近似算法分类

  • 完全可近似:可以无限趋紧最优解(背包问题)
  • 可近似:存在常数近似比算法(最小顶点覆盖,多级调度)
  • 不可近似:找不到常数近似比算法(TSP问题)

最小顶点覆盖问题

  • MVC算法 r=2

多机调度问题

  • 神TM多机调度,就是k划分问题
  • 把一个集合划分成k个子集,使这k个子集的元素和中最大值最小
  • G-MPS:贪心,按输入的顺序分配元素,把当前元素分配给当前最小的集合
  • r?$ 2-\frac{1}{k} $
  • DG-MPS:在G-MPS的基础上把元素从大到小排序
  • r?$ \frac{3}{2}-\frac{1}{2k} $

TSP

  • 最近邻法NN:每次找一个最近的没走过的点
  • r?$ \frac{1}{2}\left( \lceil log_2{n} \rceil +1 \right) $
  • 这不好使,随着城市规模变大越来越不精确
  • 有没有常数近似比算法?
  • 在满足三角不等式的情况下,确实存在常数近似比算法
  • 一般的TSP问题不存在常数近似比算法

总结

  • 并非所有问题都能用近似算法解决

信息学竞赛中的整数和多项式

  • 毕克大爷啊orz
  • orz和郑州的讲课差不多

0x00 加法,乘法和乘方

一堆集合,有属于关系,做多n个元素,计数

做过的题

JSOI 子集选取

  • $ 2^{nk} $
  • 打表题

有什么用?

  • 发现集合中的每个元素独立
  • 最后的答案一定是$ x^n $的形式

求斐波那契数列的第n项

  • 矩乘
  • 多项式取模
  • FFT优化多项式取模
  • 考虑原根,对于1或9结尾的质数p,找一个数使$ x^2 $ = 5 (mod p)
  • 认为x就是$ \sqrt{5} $,代进通项公式
  • 也可以递归
  • $ f_{2n-1}=f_{n}2+f_{n-1}2 $
  • $ f_{2n}=\left(2f_{n-1}+f_{n}\right)f_{n} $

亿兆京垓(Radixphi)

  • 直接贪心?会有精度问题。
  • $ p^n $ 有两项, $ \sqrt{5} $ 和整数项,这两项的系数分别是斐波那契数列,分数不好搞,把整数项系数乘二以后都是整数
  • 最终的目标是使选出集合中的$ \sqrt{5} $系数和为0,整数项系数和为2n
  • 显然选n个第0项是合法的,但是不能选n个
  • 选n个第0项?这和普通的斐波那契拆分一样。
  • 那么从大往小贪心也是可以的
  • 但是有负数?怎么办?
  • 不妨把整个斐波那契数列往左移47位,即令n=n+n*f[47],然后从大往小贪心
  • 这样贪心涉及的整个数列就都是正的
  • 最后的答案再-47
  • 稳!

卷积?

  • 直接暴力
  • 插值,可以快速幂
  • FFT优化插值

求$ \sum_{i=0}{n}ik $

  • 差分拆成组合数
  • 高斯消元
  • 插值

生成树计数

  • Matrix-Tree定理
  • 基尔霍夫矩阵

生成树计数改:边分红蓝两种,要求统计恰好含有k条红边的生成树个数

  • 设红边为x,蓝边为1
  • 还想刚才那么搞,最后$ x^k $就是要求的生成树个数
  • 多项式运算不好做,插值

生成树计数改二:边分红黄蓝绿四种,要求红色不少于黄色,蓝色不少于绿色

-红边$ {x^2}y \(,黄边y,蓝边\) x{y^2}$,绿边x

0x01 生成函数

  • 断线

0x02 Burnside引理 Polya定理

  • 这公式太烦了我实在不能在一页ppt的时间里敲出来

总结

  • orz 晚上试机,尝试在linux下码了个对拍,打了个起床困难综合征,居然Day0都有一道提答
  • 系统是Ubuntu 14.04 LTS
  • 没有IDE啊,我怎么遭得住
  • 临时学习命令行

版权声明:本文为LoveYayoi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/LoveYayoi/p/6745468.html