算法考试复习

引论

  • 算法与数据结构与程序的区别
    • 算法是求解问题的过程描述:从蛮力到策略
    • 数据结构是数据的组织与存储:从杂乱无章到井然有序
    • 程序 = 算法 + 数据结构
  • 算法描述
    • 自然语言
    • 伪代码
    • 流程图
  • 三种不同的计算机问题
    • 判断问题(yes,no) 例如输入的数是否大于60
    • 优化问题(求最优解) 例如从A到B的最短路径是什么
    • 数值计算
  • 常见的计算机问题
    • 排序
    • 查找
    • 串处理
    • 图问题
    • 组合问题
    • 几何问题
    • 数值问题
  • 概念
    • 什么是算法:算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
    • 算法特征
      • 输入:算法有零个或多个输入量
      • 输出:算法至少产生一个输入量
      • 确定性:没有二义性
      • 有穷性:有限步后结束
    • 要点:
      • 算法的每一个步骤必须清晰、明确
      • 算法所处理的输入的值域必须仔细定义。
      • 同样的一个算法可以用几种不同的形式来描述
      • 可能存在几种解决相同问题的算法
      • 针对同一个问题的算法可能会基于完全不同的解题思路

算法复杂性分析

  • 算法的时间效率和空间效率度量都用输入规模的函数来度量

  • 时间复杂度:

    T(n) ≈ copC(n)

    n是该算法的输入规模

    cop是特定计算机上一个算法基本操作的执行时间(基本操作:最内层循环操作)

    C(n)是该算法需要执行的基本操作的次数

    • 最优效率,最差效率,平均效率

    • 指数级复杂度与多项式级复杂度

      • 指数级复杂度:很多穷举搜索,但要尽量避免,只能用于规模很小的问题
      • 多项式算法
    • 渐进表达式:忽略常数

      • O(读"O"):上界

      • Ω(读"omiga"):下界

      • Θ(读"theta"):近似

f(n)=32n^2+17n+32,和O(n),Ω (n), Θ(n), O(n^2), Ω(n^2), Θ(n2),O(n3), Ω(n^3), Θ(n^3).相匹配

则f(n)属于O(n2)、O(n3)、Ω(n^2)、Ω (n)、Θ(n^2)

  • 理解:以O(n2)为例,O(n2)表示一个集合,表示所有比kn2小的函数(k为任意正常数),或者函数图像在kn2下方的函数,所以f(n)∈O(n2)表示32n2+17n+32也是属于此集合。

  • 注意

    • O(n^2)表示一个集合
    • 所以用等号时等价于属于符号:f(n)=O(n2)等价于f(n)∈O(n2)
    • 更加方便理解的式子

f(n)= O(g(n)) 理解为 f(n) ≤ kg(n);
f(n)= Ω(g(n)) 理解为 f(n) ≥ kg(n);
f(n)= Θ(g(n)) 理解为 f(n) = kg(n);
f(n)= o(g(n)) 理解为 f(n) < kg(n);
f(n)= ω(g(n)) 理解为 f(n) > kg(n).

基本的效率类型

c < logn < (logn)^2 < n < nlogn < n^2 < n^3 < 2^n < n!

  • n:找n个数最大值

    nlogn多出现在分治算法中:如合并排序和堆排序

    n^2:平面上多点求最近两点之间距离时每对点尝试

    n^k:多项式时间:如独立集问题

    指数时间:最大独立集问题

  • 渐进增长率比较的方法

    • 极限法

      相除取极限,=0,=c,=∞

    • 取对数再比较

贪心算法

  • 思想:每步最优

  • 硬币零钱问题 (coin changing)

    对于某些指定硬币面值类型,使用贪心策略(优先最大面值)可以求得最小硬币数来组成某数。例如我国的货币面值类型(1元,5元,十元,50元,100元),或(1,5,10,25,100)

    证明:此时贪心算法是求得的解最优解

    以(1,5,10,25,100)为例

    思路: 首先明显有性质:

N1(1元的数量)≤4   //大于4可用一个5来代替,结果更优
N5≤2
N10+N25≤2
N25≤3

对于求总额x的零钱策略:有ck ≤ x ≤ ck+1。则依照贪心策略,必须取ck。若存在非贪心最优解,则不取ck,此时就必须在c1,...ck-1中选择硬币来代替ck,则会与上述性质矛盾

  • 贪心算法不是对所有的硬币问题都适用

  • 任务安排问题 (interval scheduling )

    寻找不重叠的最多任务数。

    策略:以结束时间排序,后贪心选择不重叠最早的结束的一个任务。

    证明:此时贪心算法是求得的解最优解

    假设俩个解,

    一个是最优解(任务i1...ir,x,j1...jm)

    一个是贪心解 (任务i1...ir,y,q1...qn)

    • 前r个任务选择相同
    • x任务比y任务结束时间晚,但是m>n(最优解数量大于贪心解数量)

    则x一定可以换为y,(上一个任务相同,x任务比y任务结束时间晚,可画图来解释),所以最优解一定可以转换为贪心解,即贪心解是最优解。

  • 课程分配教室问题(interval partitioning)

    给有不同开始结束时间的课程分教室,使得教室数最少

    策略,每次贪心给一个教室最早开始时间的课程

  • 多任务最早结束问题

    每个任务有开始结束时间,问所有任务最晚结束的时间

    策略:最早结束时间排序

分治

  • 思想:分而治之

  • 步骤

    1. 将问题划分为若干个子问题(同样规模)
    2. 递归求解每个子问题,注意写好递归边界
    3. 将若干子问题的解合并成问题的解
  • 时间复杂度nlogn

  • 逆序对

    问题:给定一个序列,例如a[5]={5,4,8,10,2},找出这样的数对,i<j,a[i]>a[j]例如这个例子包含(5,4),(5,2),(4,2),(8,2),(10,2) 5个逆序对。

    策略:

    1. 分两段A,B,分别求A,B中逆序数,N1,N2。T(n)+T(n)

    2. 求a∈A,b∈B的逆序数,N3

      N3=0;

      比较ai,bj,(ai∈A,bj∈B)

      若ai小,ai入数组C,i+1

      若bj小,bj入数组C,j+1。N3+=A中剩余的数的个数。Θ(n)

      在归并排序的同时记录一个数据。

    3. 加起来,N1+N2+N3。

    有递推式:

T(n)={
Θ(1) if n=1
2T(n/2)+Θ(n) if n>1
}

主定理(master theorem )

根据递推式来确定时间复杂度

p1.png

整数乘法( integer multiplication )

问题描述

x=10001101,y=11100001,计算x*y

以x和y的位数做输入规模n,常规计算方法并不是最优Θ(n^2)

策略:

分治思想,x=10001101,y=11100001

将x和y分成前4位和后四位。

m= ⎡n/2⎤ (x,y有n位)

a = ⎣x/2^m⎦ , b = x mod 2^m

c = ⎣y/2^m⎦ ,d = y mod 2m

即a=1000,b=1101,c=1110,d=0001

利用交换律:有以下公式

xy=(2m*a+b)(2m*c+d)=2/2mac+2m(bc+ad)+bd

所以将x*y转换成了四次规模为原来一半的乘法

T(n)={
Θ(1) if n=1
4T(n/2)+Θ(n) if n>1
}

根据主定理

T(n) = Θ(n^2)所以并没有提升效率

所以但是可以观察出若求得小规模的乘法数量小于4,就会提升效率,所以将公式变形

xy=(2^m*a+b)(2^m*c+d)=2/^2mac+2^m(bc+ad)+bd
                    = 2^2m*ac+2^m(ac+bd–(a–b)(c–d))+bd

此时只有个规模更小的运算

所以

T(n)={
       Θ(1)            if n=1
       3T(n/2)+Θ(n)    if n>1
       }

则T(n) = Θ(n^log3)=O(n1.585)

  • 矩阵乘法(matrix multiplication)

    常用计算时间复杂度为Θ(n^3)

    分治,经过一系列公式推导有

    T(n) = 7T(n/2)+Θ(n^2) = =Θ(nlog7)=O(n2.81)

  • 最近点对(closest pair of points )

    问题描述:

    给定平面上n个点,求这n个点中距离最近的两个点的距离是多少。

    策略:我们将平面上的点划分为两部分,每部分n/2个点,递归求解两部分的最近点距离。难点在于子问题的合并:求出两小部分中的最近点d1,d2后,将两小部分合成一个大部分时,大部分的最近点问题(两个点来自不同的部分d3),则此时大部分最进点对距离min{d1,d2,d3}。

    • 如何寻找d3:

      • 记min{d1,d2}=δ

      • 找到距离两小部分边界小于δ的点(在横坐标区域[-δ,δ]内)

      • 计算区域内的最小距离即为d3

动态规划

重叠子问题,最优子结构

  • 带权任务安排问题:weighted interval scheduling

    此时贪心算法并不能得到最优解

    策略:

    1. 以结束时间排序 f1<f2<...<fn

    2. p(j)上一个与任务j相容的任务

    3. OPT(j)表示j前任务(1-j)相容子集最大权重,所以目标是OPT(n)

    所以对于求OPT(j),根据是否选择j有公式

OPT(j)={
  0                                 if j=0
  max{OPT(j-1),wj+OPT(p(j))}        if j>0
}
  • 矩阵连乘问题

  • 最长公共子序列

OPT(i,j)={
    o                        if i=0||j=0
    OPT(i,j)=1               if i,j>0,xi=yj
    max{OPT(i,j-1),c(i-1,j)}  if i,j>0,xi!=yj
}
  • 01背包问题

    对于i号物体有重量wi和价值vi,求总量W最多能装多少价值的东西

    策略:

    OPT(i,w)表示放前i个物体后,剩下的空间

    • 根据是否选择i号物体有公式
OPT(i,w)={
  0                                 if i=0
  OPT(i-1,w)                        if wi>w
  max{OPT(i-1,w),vi+OPT(i-1,w-wi)}  otherwise
}

P,NP,NPC,NPhard

https://blog.csdn.net/sinat_21591675/article/details/86521190 一个很好的讲解博客

  • 规约

    X规约到Y——X可由 标准多项式次数多项式次数的调用Y 组成

    规约是将一个特殊问题一般化的过程。

    X ≤ p Y.

    If X ≤ P Y and Y can be solved in polynomial time, then X can be solved in polynomial time.

    If X ≤ P Y and Y can be solved in polynomial time, then X can be solved in polynomial time.

y 比 x 难

  • P

    多项式时间里解决的判定问题

  • NP

    多项式的时间里验证一个解,不确定是否能在多项式时间求解

  • P ⊆ NP ⊆ EXP

  • P=NP? 即是否多项式验证就可多项式求解

  • NPC

    NP完全问题,最难的NP问题:所有的NP问题都可以归约到的一个NP问题。

    NPC的证明:If X ∈ NP-complete, Y ∈ NP, and X ≤ p Y, then Y ∈ NP-complete.

    Basic genres of NP-complete problems and paradigmatic examples.

    • Packing/covering problems: SET-COVER, VERTEX-COVER,INDEPENDENT-SET.

    • Constraint satisfaction problems: CIRCUIT-SAT, SAT, 3-SAT.

    • Sequencing problems: HAMILTON-CYCLE, TSP.

    • Partitioning problems: 3D-MATCHING, 3-COLOR.

    • Numerical problems: SUBSET-SUM, KNAPSACK.

  • 如果p!=np 则难度
P<NP<NPC<NP-hard
  • 如果p=np 则难度
P=NP=NPC 属于NP hard的一个子集
  • 一线

    • 点独立集和点覆盖集

      • 点覆盖集:一个点集合:图中所有边与此集合中某点邻接

      • 电独立集:一个点集合:此集合中任意两点之间没有边相连

      INDEPENDENT-SET ≡ p VERTEX-COVER.

      此两个问题可以相互规约,点覆盖集加点独立集可以合成这张图(互补)

    • 点覆盖集规约到集合覆盖

      • 集合覆盖:一个大的集合和若干子集合,求用k个子集合并集可以组成原集合。

      • 点覆盖集:一个点集合:图中所有边与此集合中某点邻接

        图中的点---子集合

        图中的边---子集合中的元素

      VERTEX-COVER ≤ p SET-COVER.

    • 可满足性问题-satisfiability (SAT)

    • 例如公式
 Φ = (x1(反) ∨ x2 ∨ x3 )∧ (x1 ∨ x2(反) ∨ x3  ) ∧(x1(反) ∨ x2 ∨ x4 )

是否存在布尔值的xi使公式的结果为ture

  x1 = true, x2 = true, x3 = false, x4 = false

3-SAT意为每个括号有三个元素

- SAT可以规约到独立集问题

  每个括号是一个三角形的图,元素做点,每个三角形之间互反的元素链接
  • 有3-SAT ≤ P INDEPENDENT-SET ≤ P VERTEX-COVER ≤ P SET-COVER.
  • 2线

    • 规约和转化

      • 转化:如果给定X的任何一个实例,我们可以构造Y的一个实例y,使得x是X的yes实例,如果Y是Y的yes实例。

      • 转化相当于规约中X只用了一次Y而不是多项式次数的Y。

    • 哈密顿环问题(遍历图中所有点的环)

      • 有向图哈密顿环问题归约到哈密顿环问题,将一个点分成三个点来模拟有向性

      • 3-SAT归约到有向图哈密顿环,问题,先根据CETIFEIR构造有向环,左到右为xi=1.后在某两点之间额外构造新连线。来验证是否符合。CETIFEIR

    • 3SAT归约到最远路径问题

    • 哈密顿环归约到旅行商问题

  • 3线

    • 3-SAT归约到3着色问题

    • 平面图和地图着色问题相互规约

      图中没有两条边相交即称这个图是平面的

      平面的图在处理很多问题(最短路径最大流最小割MST等等)上会变容易

      平面三着色问题是NPC

    • 平面图三着色与普通图三着色

      普通三着色归约到平面三着色,普通NPC -推出->平面NPC

    • K-着色问题,任何图都是4可着色图

  • 4线

    • 3可满足问题归约到子集合和问题

      Ex. { 215, 215, 275, 275, 355, 355, 420, 420, 580, 580, 655, 655 },

      W = 1505.

      Yes. 215 + 355 + 355 + 580 = 1505.

      转换到二进制

    • 子集合和归约到01背包问题

  • 树的独立集问题

    • 不带权:贪心。事实:一定有独立集包含叶子

    • 带权:动态规划

  • 最小覆盖集

    • 二倍近似,贪心
  • 3-SAT,求法

  • TSP 动态规划O(n^2 *2^n)

相似算法

  • 负载均衡

    贪心每个任务分给当前任务最小的机器,是二倍近似的。证明:考虑一次分配的过程

    优化,先将任务降序排列之后用上述贪心1.33倍近似。证明:考虑一次分配的过程

  • 中心选择

    将第一个中心放在单个中心的最佳位置,然后继续添加中心,以便每次都尽可能减小覆盖半径。反复选择下一个中心距任何现有中心最远的站点。此算法是二倍近似的

  • 最小带权点覆盖集

    出价方式。是二倍近似的

    ILP(整数规划) min∑wi*xi nph

    LP 可解决 2近似

  • 广义负载均衡

    ILP

    LP

  • 01背包问题

分界线

图的算法

  • prim,kruskal求最小代价树

  • floyd O(N^3),dijkstra O(N^2)求最短路径

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容