算法设计与分析复习

算法设计与分析复习

1.绪论

1.1算法特征及性质

特征含义
输入(input)一个算法可以有零个或多个输入。
输出(output)一个算法应有一个或多个输出,作为算法进行信息加工的结果。
确定性(definiteness)确定性指算法中的每一个步骤都必须是有明确定义的。
可行性(effectiveness)算法中所有的操作都必须足够基本,使算法的执行者或阅读者明确其含义以及如何执行。
有穷性(finiteness)算法的有穷性是指算法必须总能在执行有限步骤之后终止。
满足目标/评价算法基本原则
正确性
可使用性
可读性
健壮性
高效率与低存储量需求

1.2时间复杂度分析

算法的复杂度主要包括时间复杂度和空间复杂度.

算法的时间复杂度指算法运行所需时间,也指执行算法所需要的计算工作量。

算法复杂性在渐近意义下的记号有:O、Ω、等,分别表达运行时间的上界、运行时间的下界、运行时间的准确界等.

O上界

设函数f(n)和g(n)是定义在非负整数集合上的正函数,如果存在正整数n0和正常数c,使得当n≥n0时,有f(n)≤cg(n),就称f(n)的阶至多是O(g(n)),记做f(n) = O(g(n)),称为大O记号

image-20220504221141729

image-20220504173848870

image-20220504173905721

Ω下界

设有函数f(n)和g(n)是定义在非负整数集合上的正函数,如果存在正整数n0和正常数c,使得当n≥n0时,有f(n)≥cg(n),就称f(n)的阶至少是Ω(g(n)),记做f(n) = Ω(g(n)),称为Ω记号

image-20220504221222240

image-20220504173920701

Θ准确界

设有函数f(n)和g(n)是定义在非负整数集合上的正函数,如果存在正整数n0和正常数c1和c2(c1 ≤c2),使得当n≥n0时,
有c1 g(n)≤f(n)≤c2 g(n) ,就称f(n)的阶是Θ(g(n)),则记做f(n)=Θ(g(n)),称为Θ记号

image-20220504221252051

image-20220504173950335

1.3各个算法的时间复杂度

image-20220504220212233

排序法平均时间最差情形稳定度额外空间备注
冒泡O(n2)O(n2)稳定O(1)n小时较好
选择O(n2)O(n2)不稳定O(1)n小时较好
插入O(n2)O(n2)稳定O(1)大部分已排序时较好
基数O(logRB)O(logRB)稳定O(n)B是真数(0-9),R是基数(个十百)
ShellO(nlogn)O(ns) 1<s<2不稳定O(1)s是所选分组
快速O(nlogn)O(n2)不稳定O(nlogn)n大时较好
归并O(nlogn)O(nlogn)稳定O(1)n大时较好
O(nlogn)O(nlogn)不稳定O(1)n大时较好

时间复杂度分类

image-20220504174116963

2.递归

2.1递归方程的求解方法

设序列a0, a1, …, an, …, 简记为{an}, 一个把an与某些个ai(i<n)
联系起来的等式叫做关于序列 {an} 的递推方程

四种方法介绍

(1)迭代法:不断用递推方程的右部替换左部,有时候直接迭代可能不太方便,可以使用换元迭代。例如二分归并排序迭代方程的求解过程。

(2)差消法:差消法一般应用在递归方程右边不仅仅只依赖于当前项的前一项,而是前很多项,这种递归方程直接用迭代法很麻烦。属于高阶递归方程,因此要先把高阶递归方程进行差消,再进行迭代。例如快速排序的递归方程求解过程。

(3)递归树:建立递归树,每次迭代将函数项作为儿子,非函数项作为根的值。

(4)主定理法:

迭代法

直接迭代:插入排序最坏情况下时间分析

换元迭代:二分归并排序最坏情况下时间分析

差消迭代:快速排序平均情况下的时间分析

迭代模型:递归树

尝试法:快速排序平均情况下的时间分析

主定理:递归算法的分析

一、迭代法

image-20220504174545183

image-20220505094042660

image-20220505094105811

image-20220504180653817

image-20220504180706384

二、迭代树

树根:递归方程右侧除了函数外的剩余表达式

树叶:方程右侧的一个递归的函数项

最后所有结点的全之和就是W(n)

image-20220504180951286

image-20220504181006455

image-20220505094234715

三、主定理

image-20220504181040068

image-20220504181050676

image-20220504181106689

image-20220504181216502

image-20220505094341105

四、线性齐次方程求解

3.各类算法的基本思想和解题步骤

快速排序
快速排序的基本思想:

快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

快速排序的三个步骤:

(1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 “基准”(pivot)

(2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大

(3)递归地对两个序列进行快速排序,直到序列为空或者只有一个元素。

一、分治法

基本思想:

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成

解题步骤:
  1. 分解成若干个子问题
  2. 求解子问题
  3. 合并子问题

二、蛮力法

三、回溯法

基本思想:

确定了解空间的组织结构后,回溯法从根节点出发,以深度优先搜索方式搜索整个解空间。回溯法以这种工作方式递归地在解空间中搜索,直到找到所要求的解或解空间所有解都被遍历过为止。

回溯法又称试探法。回溯法的基本做法是深度优先搜索,是一种组织得井井有条的、能避免不必要重复搜索的穷举式搜索算法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。

解题步骤:

(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索的解空间结构;
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

四、贪心法

基本思想:

对问题求解时总是做出在当前看来是最好的选择,即不从整体最优上加以考虑,只做某种意义上的局部最优解

希望通过局部最优决策导致问题的全局最优解

贪心法的当前选择可能要依赖已经做出的所有选择,但不依赖于有待于做出的选择和子问题。因此贪心法自顶向下,一步一步地做出贪心选择。

求解步骤:
  1. 建立数学模型来描述问题
  2. 把求解的问题分成若干个子问题
  3. 对每一个子问题求解,得到子问题的局部最优解
  4. 把子问题的局部最优解合成原来解问题的一个解

五、动态规划

基本思想:

把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系逐个击破

image-20220505102540737

解题步骤:
  1. 找出最优解的性质,并刻划其结构特征。
  2. 递归地定义最优值。
  3. 以自底向上的方式计算出最优值。
  4. 根据计算最优值时得到的信息,构造最优解
三个性质:

1.最优性原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优性原理。

2.无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

9)]

解题步骤:
  1. 找出最优解的性质,并刻划其结构特征。
  2. 递归地定义最优值。
  3. 以自底向上的方式计算出最优值。
  4. 根据计算最优值时得到的信息,构造最优解
三个性质:

1.最优性原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优性原理。

2.无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

3.有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

石先森很疯狂

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

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

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

打赏作者

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

抵扣说明:

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

余额充值