算法导论证明部分

课程大纲

一、算法的基本概念

1.1 算法的基本概念、算法和问题

算法:一个定义良好的计算过程,它以某个值或一组值为输入,并产生某个值或一组值为输出
在这里插入图片描述
计算问题一般指明输入和输出的关系。
问题的实例由计算该问题的解决方案所需的输入组成
如果一个算法在每个输入实例中都得到正确的输出,那么它就是正确的。我们说一个正确的算法解决了给定的计算问题

设计算法(以插入排序为例):
(1)问题的形式化
在这里插入图片描述

(2)算法(伪代码、设计)
在这里插入图片描述

(3)分析
· 正确性
· 效率

涉及了一个计算模型–图灵机
DTM——确定性图灵机
作用:确定一个整数的奇偶性
机器实现过程:
· 配置:在这里插入图片描述
sy—偶数; sn—奇数
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
运行时间:步数
内存:利用的磁带单元数

另一个计算模型例子——RAM随机存取器
单处理器:指令一个接一个地执行;没有并发
原始操作:

  • 算术运算(加、减、乘、除、取余、取整)
  • 数据移动(load、copy、stroe)
  • 控制(有条件/无条件地分支、子程序调用和返回)

每条这样的指令花费的时间是固定
运行时间:原始操作的数量–可以看作一个函数的输入个数n
空间:利用的内存单元数

1.2 对算的衡量–时空复杂性

以排序算法为例:
在这里插入图片描述
在这里插入图片描述
最好情况:tj = 1
在这里插入图片描述
最坏情况:tj = j
在这里插入图片描述

1.3 函数的增长–渐进符号

O O O——渐进上界
在这里插入图片描述在这里插入图片描述

性质:

  • 自反性—— f = O ( f ) f = O(f) f=O(f)
  • 乘积—— f 1 = O ( g 1 ) , f 2 = O ( g 2 ) → f 1 f 2 = O ( g 1 g 2 ) f_1=O(g_1),f_2=O(g_2)\rightarrow f_1f_2 = O(g_1g_2) f1=O(g1),f2=O(g2)f1f2=O(g1g2)
  • 和—— f 1 = O ( g 1 ) , f 2 = O ( g 2 ) → f 1 + f 2 = O ( m a x { g 1 , g 2 } ) f_1=O(g_1),f_2=O(g_2)\rightarrow f_1+f_2 = O(max \{g_1,g_2\} ) f1=O(g1),f2=O(g2)f1+f2=O(max{g1,g2})
  • 传递性—— f = O ( g ) , g = O ( h ) → f = O ( h ) f=O(g),g=O(h)\rightarrow f=O(h) f=O(g),g=O(h)f=O(h)

Ω \Omega Ω——渐进下界
在这里插入图片描述
Θ \Theta Θ——渐进紧确界
在这里插入图片描述
在这里插入图片描述
o o o——非紧确上界
在这里插入图片描述
ω \omega ω——非紧确下界
在这里插入图片描述

二、分治法

2.1 分治法的基本思想–归并排序

分治法:

  1. divide–将问题分成几个同类的子问题
  2. solve–递归地解决子问题
  3. combine–将子问题的解决方案组合成整体解决方案

在这里插入图片描述

以归并排序为例:

  • 将数组分成两部分

  • 分别为两部分排序

  • 最后将已排序的数组合并
    divide & solve
    combine
    分析时间复杂度:
    在这里插入图片描述
    得到递归式:
    在这里插入图片描述
    如何求解递归式?

    • 代入法
    • 递归树法
    • 主方法
    1. 代入法
      提出假设——>验证假设、求解常数
      在这里插入图片描述在这里插入图片描述
      在这里插入图片描述在这里插入图片描述

    2.递归树
    在这里插入图片描述
    3. 主方法
    在这里插入图片描述在这里插入图片描述

2.2 最大子数组问题

三种可能情况:
在这里插入图片描述
分治法:
在这里插入图片描述在这里插入图片描述
很容易能够得到递归式:
在这里插入图片描述

三、动态规划

动态规划(Dynamic Programming)与分而治之(divide-and-conquer):通过组合子问题的解来求解原问题。
1、分治法:互不相交的子问题,递归地求解子问题。如果子问题有重叠,则递归求解中就会反复地求解这些公共子问题,造成算法效率的下降。
2、动态规划:有子问题重叠的情况,即不同的子问题具有公共的子子问题。动态规划算法对每个这样的子子问题只求解一次,将其解保存在一个表格中,再次碰到时,无需重新计算,只从表中找到上次计算的结果加以引用即可。

最优化问题(optimization problems):这一类问题的可行解可能有很多个。每个解都有一个值,我们希望寻找具有最优值的解(最小值或最大值)
注:这里,我们称这个解为问题的一个最优解(an optimal solution),而不是the optimal solution,因为最优解也可能有多个

动态规划算法的步骤:

  1. 刻画一个最优解的结构特征;
  2. 递归地定义最优解的值;
  3. 计算最优解的值,通常采用自底向上的方法;
  4. 利用计算出的信息,构造一个最优解。

3.1 钢条切割、矩阵乘法–动态规划设计方法

一、钢条切割:
给定一段长度为n英寸的钢条和一个价格表P,求切割钢条方案,使得销售收益 rn 最大。
如果长度为n英寸的钢条的价格pn足够大,则可能完全不需要切割,出售整条钢条是最好的收益。
在这里插入图片描述
在这里插入图片描述

递归求解:
在这里插入图片描述

动态规划:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

子问题图
在这里插入图片描述在这里插入图片描述
重构解——以给出切割方案:
在这里插入图片描述在这里插入图片描述

二、矩阵链乘法
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

构造最优解:
在这里插入图片描述

3.2 动态规划原理、设计和分析动态规划算法

如何设计DP算法:
(1)最优子结构
在这里插入图片描述
“剪切-粘贴”(cut-and-paste)技术
一般用反证法证明:假定子问题的解不是其自身的最优解,而存在“更优的解” ,那么我们可以从原问题的解中“剪切”掉这些“最优解”的部分,而将“更优的解”粘贴进去,从而得到原问题的一个“更优”解,这与最初的解是原问题最优解的前提假设相矛盾。因此,不可能存在“更优的解”。反之,原问题的子问题的解应是其自身的最优解——最优子结构性成立。
在这里插入图片描述

(2)状态转移方程
在这里插入图片描述
(3)最优解的构造
在这里插入图片描述

DP满足两个要素

  1. 具备最优子结构
  2. 子问题重叠

DP算法时间
求原问题最优解的代价通常就是子问题最优解的代价再加上由此次选择直接产生的代价

3.3 最长公共子序列

在这里插入图片描述
递推式
在这里插入图片描述在这里插入图片描述在这里插入图片描述

四、贪心算法

贪心算法是这样一种方法,分步骤实施,它在每一步仅作出当时看起来最佳的选择,即局部最优的选择,希望这样的选择能导致全局最优解。

经典问题:最小生成树问题的Prim算法(加点法)、Cruskal算法(加边法),单源最短路径Dijkstra算法等,以及一些近似算法。

4.1 活动选择问题

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
证明:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

4.2 贪心算法原理、设计和分析

贪心求解的一般步骤:

  1. 确定问题的最优子结构
  2. 每次对其作出一次选择;
  3. 证明作出贪心选择后,原问题总是存在最优解,即安全;
  4. 证明作出贪心选择后,剩余的子问题满足:其最优解与贪心选择组合即可得到原问题的最优解。

贪心算法中贪心选择性质和最优子结构性是两个关键要素:

  1. 贪心选择性质:可以通过做出局部最优(贪心)选择来构造全局最优解。
    如何证明?
    通常先考查某个子问题的最优解,然后用贪心选择替换某个其它选择来修改此解,从而得到一个相似但更小的子问题。
  2. 最优子结构性在这里插入图片描述

0-1背包问题:
贪心算法:
在这里插入图片描述
动态规划:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

4.3 Dijkstra最短路算法

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

证明正确性:

在这里插入图片描述

五、最短路问题

最优子结构:
在这里插入图片描述

三角不等式:
在这里插入图片描述
上界性质:
在这里插入图片描述在这里插入图片描述
无路径性质:
在这里插入图片描述在这里插入图片描述
收敛性质:
在这里插入图片描述
路径松弛性质:

在这里插入图片描述

证明 G π G_\pi Gπ是最短路径树:
首先证明引理——前驱子图形成以源点为根的有根树
在这里插入图片描述在这里插入图片描述在这里插入图片描述

前趋子图性质:
在这里插入图片描述
无负环:
在这里插入图片描述
简单路径:
在这里插入图片描述
动态规划寻找最短路:
在这里插入图片描述在这里插入图片描述
检测负环:

在这里插入图片描述在这里插入图片描述在这里插入图片描述

5.1 Bellman-Ford算法

在这里插入图片描述
证明正确性:
在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述
DAG算法的正确性:
在这里插入图片描述

在这里插入图片描述

5.2 基于矩阵乘法的动态规划算法

边数入手:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

5.3 Floyd-Warshall算法

结点入手:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述

六、最大流问题

6.1 流网络的基本概念

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

6.2 Fold-Fulkerson算法

在这里插入图片描述在这里插入图片描述在这里插入图片描述

最后的残差网络中,源点s能够到达的结点集合——最小割
在这里插入图片描述
在这里插入图片描述
最小割的值=最大流流量

流与切割之间的关系
在这里插入图片描述在这里插入图片描述在这里插入图片描述

弱对偶性:

在这里插入图片描述
最大流最小割:
在这里插入图片描述在这里插入图片描述

增广路径定理:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

6.3 最大匹配问题

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

七、NP完全性

7.1 了解P和NP的基本概念

7.2 归约和NP完全性

归约:
在这里插入图片描述在这里插入图片描述

证明是个NPC问题:
在这里插入图片描述

7.3 NP完全问题举例

主要是团问题、定点覆盖问题、子集和问题
哈密顿回路的证明不用掌握(先别看了)

3 − S A T − C N F ≤ p C l i q u e 3-SAT-CNF\le_p Clique 3SATCNFpClique
在这里插入图片描述在这里插入图片描述在这里插入图片描述
C L I Q U E ≤ p V e r t e x C O V E R CLIQUE\le_p Vertex COVER CLIQUEpVertexCOVER
在这里插入图片描述在这里插入图片描述在这里插入图片描述

证明集合覆盖是NPC问题:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

八、近似算法

*8.1 顶点覆盖问题的近似算法

在这里插入图片描述在这里插入图片描述在这里插入图片描述

证明:
在这里插入图片描述

8.2 度量TSP问题的算法和一般TSP问题的不可近似性

三角不等式:
在这里插入图片描述在这里插入图片描述
证明:
在这里插入图片描述在这里插入图片描述
不满足三角不等式:

在这里插入图片描述在这里插入图片描述

T T

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

边懵懵'.ㅅ'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值