算法考试复习

目录

一、简答题 * 30’

记号O、Ω、θ的意义

分治法的基本步骤

动态规划算法的两个基本要素

设计动态规划算法的步骤

分治法和动态规划算法的异同点

贪心法的两个基本要素

贪心法的算法正确性证明的基本策略

贪心算法与动态规划的异同点

在对图的深度优先搜索过程中,可将顶点的状态区分为哪三种,将有向图中的边分为那四种类型?

如果有向带权图中存在边的权值为负的情形,如何判断图中是否存在负环

最大流、最小割的概念

最大流最小割定理及其证明

带需求和下界的流通问题

多项式规约(reduction)的概念和用途

P问题、NP问题、NPC问题、NPH问题的概念

NP完全问题的实际证明方法

常见的NP完全问题

Hill_climbing和best_first等搜索算法的基本思想

二、应用题 * 40’

多段图上的最短路径动态规划推到

图的深度优先搜索算法的扩展和应用

强连通分量的划分算法

图的传递闭包算法Warshall的基本思想和过程

Bellman_Ford算法的基本思想和过程

最大流最小割问题的求解算法Ford_Fulkerson(增广路径算法)

最大流最小算法的应用,如二部图匹配、边不交路径问题、项目选择问题

递归方程的求解

三、算法设计题 * 30’

分治法:统计逆序对、中位数查找、主元素查找

贪心法:Dijkstra算法、区间调度问题、区间划分问题

动态规划问题:最长递增子序列、编辑距离问题、矩阵连乘问题、背包问题、树的最小独立集等

图算法:深度优先搜索、最短路径问题等


记号O、Ω、θ的意义

  • O:时间复杂度函数的上界

  • Ω:时间复杂度函数的下界

  • θ:时间复杂度函数的精确且紧致的界

分治法的基本步骤

  • 将原问题划分成相同类型的子问题
  • 递归地求解子问题
  • 合并递归解

动态规划算法的两个基本要素

  • 最优子结构:最优解包含了其子问题的最优解
  • 重叠子问题

设计动态规划算法的步骤

  • 寻找最优子结构
  • 建立DP方程
  • 求解DP方程
  • 回溯最优解

分治法和动态规划算法的异同点

  • 同:都要求原问题具有最优子结构,即可以分而治之
  • 异:
    1. 分治法利用递归求解;动态规划多用迭代法
    2. 分治法的子问题是相互独立的;动态规划的子问题是有重叠的

贪心法的两个基本要素

  • 局部最优解(贪心选择性质)
  • 最优子结构

贪心法的算法正确性证明的基本策略

  • 证明在每次决策阶段,使用贪心法所作出的选择,都不差于其他可能的选择,即至少同任何其他可能的选择一样好
  • 通过贪心选择替换方法证明
    1. 假设原问题存在一个最优解,且该最优解不同于贪心法所得的解
    2. 给出该最优解与贪心解的一个不同之处
    3. 证明我们可以将该最优解的一次最有选择替换成贪心选择,而不会降低解的质量
  • 对于原问题的所有解,给出一个其必须满足的界限,然后证明使用贪心法所得到的解总是可以到达该界限
  • 数学归纳法(induction)
  • 反证法(contradiction)

贪心算法与动态规划的异同点

  • 同:都用来求最优化决策问题
  • 异:贪心法寻找当前最优解,是自顶向下的;动态规划寻找全局最优解,多为自底向上

在对图的深度优先搜索过程中,可将顶点的状态区分为哪三种,将有向图中的边分为那四种类型?

  1. 顶点状态
    • white:未访问
    • gray: 已访问,但其子孙还没被访问完
    • black:已访问完,且子孙也被访问完
  2. 有向图中的边
    • tree edge:树边 (u,v), v是未被访问的顶点
    • back edge:反向边、回边 (u,v), v是u的祖先,且v是被访问过的
    • forward edge:前向边 (u,v), u是v的祖先,且v是被访问过的
    • cross edge:横向边、交叉边 不是以上三种边的其他的统称

如果有向带权图中存在边的权值为负的情形,如何判断图中是否存在负环

一个完整Bellman_Ford算法找出单源最短路径,再将所有边update一遍,看dist[]有没有变小。若dist[]变小,则存在负环。

1
2
3
4
5
6
7
8
9
Bellman_Ford:

shortest_path(G,l,s)
    for all u in V
        dist[u]=INF
    dist[s]=0
    repeat |v|-1 times:
        for all e in E
            update(e)
process  update( edge(u,v) )
    if dist[v] > dist[u]+l(u,v)
        dist[v] = dist[u]+l(u,v)

最大流、最小割的概念

最大流最小割定理及其证明

带需求和下界的流通问题

多项式规约(reduction)的概念和用途

  1. 概念

给定两个问题A、B,我们称问题A可多项式规约成问题B,当其满足以下条件:

存在一个函数f,f可在多项式时间内将问题A的输入转化成问题B的输入

A(x)=Yes 等价于 B(f(x))=Yes
记作A \< B,解决问题B至少同解决问题A一样困难

  1. 用途:
    • 确定问题的多项式时间可解性
    • 确定问题的难解性
    • 确定问题的同等困难性

P问题、NP问题、NPC问题、NPH问题的概念

  1. P问题:能在多项式时间内解决的决策问题。 如图搜索、最短路径、最小生成树

  2. NP问题:多项式时间内能验证的问题。如汉密尔顿问题、Hamilton回路

  3. NPC问题(NP完全问题):目前不能用多项式时间解决的问题,但是还不能证明这个问题不能在多项式时间内解决。

  4. NPH问题(NP困难问题):满足NP的第二条,但不一定满足第一条

NP完全问题的实际证明方法

  • 证明A属于NP问题
  • 选取已知的NPC问题,证明此问题可在多项式时间内 转换成问题A

常见的NP完全问题

  • 团问题:关于寻找图中规模最大的团的最优化问题
  • 最大独立集问题
  • 顶点覆盖问题:在一个给定图中,找出具有最小规模的顶点覆盖
  • 哈密顿回路问题
  • 旅行商问题

Hill_climbing和best_first等搜索算法的基本思想

  • Hill_climbing爬山算法

爬山算法是启发式搜索的一种,意图避免遍历全部元素。像爬山一样,想要到最高峰,就先登眼前的最高小山峰。采用了类似贪心的局部择优策略。

- Best\_First搜索算法

最佳优先算法在深度优先的基础上增加了估价函数。Best_First Search = DFS + BFS

Best_First Search算法描述:
1. N表示已排序的结点表(有小到大
2. 若N空,则结束。(初始时,N中只有根结点)
3. 取N的首元素n,并在N中删除n。若n为目标元素,则停止;否则,转到步骤4
4. 将n的后继结点加入N中,记作N',对N'排序,转到步骤1


- BFS(广度优先搜索)

算法描述:
    1. 根节点入**队列**Q
    2. 队首元素是否为目标元素,若是,停止;否则,转到步骤3
    3. 队首元素出队列,将其后继结点入队列
    4. 若Q空,结束;否则,转到步骤2

BFS伪代码:

BFS(G,s)
    for all u in V
        dist[u] = INF
    dist(s) = 0
    Q = [s] // queue containing just s
    while Q is not empty
        u = DeQueue(Q)
        for all edges(u,v) in E
            if  dist(v) = INF
                EnQueue(Q,v)
                dist(v) = dist(u) + 1


- DFS(深度优先搜索)
算法描述
    1. 根节点入**栈**S
    2. 栈顶元素是否为目标元素,若是,停止;否则,转到步骤3
    3. 栈顶元素出队列,将其后继结点入栈
    4. 若S空,结束;否则,转到步骤2
DFS伪代码:
DFS(s)
    for each u in V
        color[u] = white
    clock = 1
    for each u in V
        if color[u] = white
        then explore(G,u)

explore(G,u)
    color[u] = gray
    pre[u] = clock
    clock = clock + 1
    for each (u,v) in E
        if color[v] = white
        then explore(G,v)
    color[u] = black
    post[u] = clock
    clock = clock + 1

应用题 * 40’

多段图上的最短路径动态规划推到

图的深度优先搜索算法的扩展和应用

强连通分量的划分算法

图的传递闭包算法Warshall的基本思想和过程

Bellman_Ford算法的基本思想和过程

最大流最小割问题的求解算法Ford_Fulkerson(增广路径算法)

最大流最小算法的应用,如二部图匹配、边不交路径问题、项目选择问题

递归方程的求解

算法设计题 * 30’

分治法:统计逆序对、中位数查找、主元素查找

  • 统计逆序对
  • 中位数查找

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    Find_kth(A,low,high,kth)
        if low == high
            return A[low]
        q = random_patition(A,low,high)
        k = p - low + 1
        if kth == k
            return A[q]
        else if kth < k
            return Find_kth(A,low,q-1,kth)
        else    return  Find_kth(A,q+1,high,kth-i)
    
  • 主元素查找

贪心法:Dijkstra算法、区间调度问题、区间划分问题

  • Dijkstra算法

  • 区间调度(递归)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    贪心选择:最早结束
    Recursive_Interval_Scheduling(s,f,i,j)
        m = i + 1
        while m < j and Sm < fi
            m = m + 1
        if m < j
            return {am} 并 Recursive_Interval_Scheduling(s,f,m,j)
        else
            return 0
    
  • 区间调度(迭代)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Greedy_Interval_Scheduling(s,f)
    	n = length[s]
        A={1}
        i=1
        for m=2 to n
        	if Sm > fi
            	A = A 并 {am}
                i = m
            return A
    

动态规划问题:最长递增子序列、编辑距离问题、矩阵连乘问题、背包问题、树的最小独立集等

  • 最长递增子序列

    1
    2
    3
    4
    
    设L(i)表示以i为结点的最长递增子序列的长度,L(0)=1
    for k=0 to i-1
        if  a[k] < a[i]:    L(i)=max(L[k]+1);
        if all a[k] > a[i]: L[i]=1;
    
  • 矩阵连乘

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    for i=0 to n-1
        m(i,j)=0;
        for len=1 to n-1
            for i =1 to n-len
                j=i+len
                m(i,j)=INFINITY
                for k=i to j-1
                    q=m(i,k)+m(k+1,j)+P[i-1]*P[k]*P[j];
                    if q < m(i,j)
                    then    m(i,j)=q
    return (1,n);
    
  • 编辑距离

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    EdieDistance(A[1...m],B[1...n])
        //base case
        for i = 0 to m
            E(i,0) = i
        for j= 1 to n
            E(0,j) = j
        //填充表格
        for i = 1 to m
            for j=1 to n
                E(i,j) = min{1+E(i-1,j),1+E(i,j-1),1+E(i-1,j-1)}
        return E(m,n)
    
  • 背包问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    0-1 Knapsack Algorithm
    for w = 0 to W
        B[0,w] = 0
    for i =0 to n
        B[i,0] = 0
    for w = 0 to W
        if wi <= w
            if vi+B[i-1,wi] > B[i-1,w]
                B[i,w] = vi + B[i-1,w-wi]
            else
                B[i,w] = B[i-1,w]
        else
            B[i,w]=B[i-1,w]
    

图算法:深度优先搜索、最短路径问题等

你可能感兴趣的:(数据结构与算法)