算法设计与分析1(算法设计和分析的数学和定理基础)

算法设计与分析

视频指路:【北大公开课】 算法设计与分析 屈婉玲教授 (76p)
https://www.bilibili.com/video/BV1Ls411W7PB?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=e094efdd3063cf10d20b43f659f855a6

第一部分:算法设计和分析的数学和定理基础

算法设计的两个例子

调度问题

image-20220709155025889

贪心法的解:按照加工时间从小到达安排,即3,5,8,10,15

image-20220709155422811

贪心算法的反例:

image-20220709155612083

按照贪心算法:单位重量价值最大的优先,按照 价值/重量 从大到小排序

image-20220709155811404

然而存在更优的解:

image-20220709155837492

算法设计:

image-20220709155930398

投资问题

image-20220709160719604

对问题进行建模:

image-20220709160804527

蛮力算法(枚举):将每一种可能的分配方案计算出结果,选择最优的解

蛮力算法的效率:

​ 数学的求解过程:(可只关注结论)

image-20220709161356269

image-20220709161411655

结果的推导过程参考:stirling公式

image-20220710120504269

结论:蛮力算法的效率为指数函数,效率极低.因此有些问题容易找到好的算法,有些问题需要设计更好的算法

image-20220709161726061

问题计算复杂度的界定:以排序问题为例

image-20220709161819814

以上算法的具体过程见数据结构

问题计算复杂度的分析:同一个问题的不同种算法同时考虑分析

​ 哪个排序算法的效率最高?

​ 排序问题的难度?

货郎问题与计算复杂性理论

货郎问题:

image-20220709164314260

问题的建模:

image-20220709164341821

0-1背包问题:

image-20220709164422674

问题的建模:

image-20220709164457229

双机调度问题:

image-20220709164535856

问题的分析:

image-20220709164610868

以上问题都没有找到有效的算法可以解决,被称为NP-Hard问题

NP-Hard问题:

​ 存在大量的这类问题

​ 至今没有找到有效算法:现有算法的运行时间是输入的指数或更高级别

至今没有人能证明不存在这类问题的多项式时间的算法

​ 从多项式时间的算法角度来看,这类问题等价,这类问题的难度处于可有效计算的边界

image-20220709165151580

课程内容:

image-20220709165219209

算法及其时间复杂度

问题及实例的概念

image-20220709202248984

算法的概念

image-20220709202428286

基本运算与输入规模

image-20220709204214987

​ 输入规模:

image-20220709204307230

​ 基本运算:

image-20220709204339740

算法的两种时间复杂度

image-20220709204026428

平均时间复杂度的计算

image-20220709204103789

算法的伪码表示

算法的伪码描述

image-20220710095747150

求最大公约数:欧几里得算法

image-20220710095913030

image-20220710110505269

小结

image-20220710110534797

函数渐进的界

大O符号:可以接触到的上界,fn阶数不高于gn

image-20220710111806732

image-20220710112032777

大Ω符号:可以接触到的下界,fn阶数不低于gn

image-20220710112118007

image-20220710112144487

小o符号:接触不到的上界,fn阶数低于gn

image-20220710112232578

image-20220710112521035

小Ω符号:接触不到的下界,fn阶数高于gn

image-20220710112605122

image-20220710112625696

Θ符号:既是可接触的上界又是可接触的下界,fn和gn阶数相同

image-20220710112725836

image-20220710112832238

时间复杂度:O(n1/2) //可接触的上界

有关函数渐进界的定理(计算时间复杂度时使用)

image-20220710113728582

用于判断fn和gn的阶数高低

推论:

image-20220710113831530

image-20220710113850974

用于判断时间复杂度为对数,幂函数,指数函数时的关系大小

image-20220710114013719

用于判断各函数的阶数大小关系

image-20220710114518208

用于判断一个算法中不同基本运算次数在时间复杂度上取哪个(算法的时间复杂度是各步操作之和,在常数步的情况下取最高阶的函数即可)

几类重要函数

基本函数类

image-20220710115833216

指数>多项式>对数多项式,每一级都相对于上一级爆炸增长

指数级的算法是不可运算的!

对数函数

​ 简写说明:

image-20220710120000135

​ 性质:

image-20220710120029211

​ 1.在考虑算法的复杂度时不需要考虑对数底的大小

​ 2.对数要小于幂函数

​ 3.此情况下对数指数函数和幂函数相等

指数函数与阶乘

image-20220710120235723

阶乘要小于nn,要大于2n,阶乘的对数和nlogn同阶

取整函数

image-20220711084842764

性质:

image-20220711084935024

按照阶排序的实例

image-20220711085232515

从左到右阶数依次变小,从上往下量级依次变小

序列求和的方法(求迭代过程的算法的时间复杂度)

求和公式

image-20220711091046450

一个例子:

image-20220711091205353

应用:二分检索法的平均时间复杂度

image-20220711092043473

image-20220711091332542

image-20220711091455914

估计和式上界的放大法

image-20220711092520799

一个例子:

image-20220711092613094

估计和式渐进的界:

image-20220711092727662

image-20220711092808059

结论:调和级数和logn同阶

递推方程与算法分析(递归的算法的时间复杂度求解)

递推方程的定义

image-20220711094204606

几个例子

fibonacci数列:

image-20220711094250514

最下面的红框即为递推方程的解

汉诺塔问题:

image-20220711094417387

image-20220711094448777

利用迭代求递推公式的解

即时间复杂度为指数级!

这是一个难解问题,不存在多项式时间的算法

插入排序

image-20220711094643986

W(n-1)为上一个元素插入排序的时间复杂度,n-1为这一个元素最坏情况下需要比较的次数

利用迭代求递推公式的解

迭代法求解递推方程

直接迭代

image-20220711102559786

以汉诺塔为例做迭代求递推公式的解:

image-20220711102905228

换元迭代

image-20220711103014457

以二分归并排序为例做换元迭代:

image-20220711103119385

W(n/2)为后面两次递归的排序的时间复杂度,n-1为这次排序需要对比的次数

image-20220711103248099

可以用数学归纳法验证正确性

image-20220711103525939

差消法化简高阶递推方程(以快速排序的时间复杂度分析为例)

快速排序时间复杂度分析:

image-20220711104832931

image-20220711104906742

image-20220711104926597

平均工作量=总工作量/输入情况个数n

image-20220711104952644

差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶目的

image-20220711105208956

下面两式相减,可消去∑处的大部分项

image-20220711105534480

image-20220711105556224

递归树(是迭代的模型)

递归树的概念

image-20220711111010181

迭代在递归中的表示:

image-20220711111048087

递归树的生成规则:

image-20220711111249791

递归树往往使用在需要迭代的项数大于1的情况

实例一:以二分归并排序的时间复杂度分析为例做递归树的应用

image-20220711111322100

image-20220711111343390

写出递归树前几层后,分析每一层的总和,根据每一层的规律推导出总的时间复杂度

image-20220711111512954

实例二

image-20220711111713710

注意:这棵迭代数左边递减速度大于右边,所以树右边的层数会大于左边,因此最后一层的总和不超过n,即O(n)

image-20220711112709144

这里的求和只看最右边这一路:每一次迭代乘以2/3,总共迭代k次,即最后一层的表达式为(2/3)kn,等于最后的初值为1,从而求出k

最后得到:

image-20220711113238709

logn为层数k,n为每层的总和

主定理及其应用(用于求解递推方程的解,得到时间复杂度)

主定理的应用背景

image-20220712091820813

主定理的概念:

image-20220712091857618

主定理的应用:

image-20220712100141461

image-20220712094747470

image-20220712095006493

image-20220712100028681

image-20220712100056882

不可以使用的例子:

image-20220712100206508

使用递归树求解:

image-20220712100241674

image-20220712100300888

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《哈工大高级算法设计与分析》第一章主要介绍了算法设计与分析的基本概念和方法。算法设计是指根据问题的特性和求解的要求,设计出解决问题的具体步骤和策略的过程。而算法分析则是对所设计的算法进行评估和分析,以确定其时间复杂性和空间复杂性等指标。 在本章中,作者首先介绍了算法设计与分析的背景和意义,强调了优秀算法在解决实际问题中的重要性。然后,详细介绍了算法设计分析的一般过程,包括问题的描述、问题的建模和算法的设计等步骤。作者指出,良好的问题描述和合理的问题建模是设计出高效算法的前提。 在算法设计方面,本章主要介绍了两种常用的算法设计策略:分治法和动态规划法。作者通过实际例子和数学证明,详细解释了这两种算法策略的基本思想和应用场景。分治法是将原问题划分成若干个相似的子问题进行求解,最后将子问题的解合并得到原问题的解;而动态规划法是通过将原问题分解成若干个阶段,每个阶段的最优解依赖于前一阶段的最优解,最终得到全局最优解。 在算法分析方面,本章介绍了算法复杂性的度量方法和分析技术。作者详细介绍了时间复杂性和空间复杂性的概念和计算方法,并介绍了常见的渐进符号表示法。此外,作者还介绍了常用的算法分析技术,包括递归树法、迭代求解法和主定理等。 通过学习《哈工大高级算法设计与分析》第一章,我对算法设计分析的基本概念和方法有了初步的认识。我明白了问题描述和问题建模对算法设计的重要性,也学会了分治法和动态规划法这两种常用的算法设计策略。此外,我还了解了算法复杂性的度量方法和分析技术,能够对算法的效率进行评估和分析。这些知识将为我今后的学习和实践提供坚实的基础

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值