学习手札 | 算法导论笔记(二):渐进记号与分治策略
《算法导论》打卡2,主要内容:渐进记号,分治策略,最大子数组问题,矩阵乘法的strassen算法
第三章 函数的增长
- 当输入规模足够大,使得只有运行时间的增长量级有关时,我们要研究算法的渐进效率。也就是说,我们关心当输入规模无限增加时,在极限中,算法的运行时间如何随着输入规模的变大而增加。
3.1 渐进记号
- 用来描述算法渐进运行时间的记号根据定义于为自然数集N={0,1,2,…}的函数来定义
3.1.1 Θ记号
Θ记号:对一个给定的函数g(n),用Θ(g(n))来表示以下函数的集合:
Θ(g(n))={f(n):存在正常量c1,c2和n0,使得对所有n≥n0,有0≤c1*g(n)≤f(n)≤c2*g(n)}
3.1.2 O记号
O记号:当只有一个渐进上界时,使用O记号,对于一个给定的函数g(n),用O(g(n))来表示以下函数的集合:
O(g(n))={f(n):存在正常量c和n0,使得对所有n≥n0,有0≤f(n)≤c*g(n)}
3.1.3 Ω记号
-
Ω记号:渐进下界。使用Ω记号,对于一个给定的函数g(n),用Ω(g(n))来表示以下函数的集合:
Ω(g(n))={f(n):存在正常量c和n0,使得对所有n≥n0,有0≤c*g(n)≤f(n)} -
定理:
对任意两个函数f(n)和g(n),我们有f(n)=Θ(g(n)),当且仅当f(n)=O(g(n))且f(n)=Ω(g(n))
3.1.4 o记号
o记号:表示非渐进紧确的上界
o(g(n))={f(n):对于任意正常书c>0,存在常量n0>0,使得对所有n≥n0,有0≤f(n)<c*g(n)}
3.1.5 w记号
w记号:表示非渐进紧确的下界
w(g(n))={f(n):对任意正常量c>0,存在常量n0>0,使得对所有n≥n0,有0≤c*g(n)<f(n)}
3.2 标准记号与常用函数
- 单调性
- 向下取整与向上取整符号
- 模运算
- 多项式
- 指数
- 对数
- 阶乘
- 多重函数
- 多重对数函数
- 斐波那契数
第四章 分治策略
- 分治策略的步骤:
分解,解决,合并 - 递归情况:子问题足够大,需要递归求解
- 基本情况:子问题足够小,递归已“触底”
- 递归式:通过更小的输入上的函数值来描述一个函数
- 求解递归式的方法:
- 代入法
- 递归树法
- 主方法
4.1 最大子数组问题
- 由于时间原因,最大化利益不一定是最低价格买入,最高价格卖出,因为存在最高价格先于最低价格出现的可能
- 暴力破解方法:尝试每一对可能的买入卖出,只要卖出时间在买入时间之后即可。
- 问题交换:
- 只有当数组中包含负数时,最大子数组问题才有意义,如果所有数组元素都是非负的,最大数组问题没有任何难度,因为整个数组的和肯定是最大的。
- 使用分治策略的求解方法:
- python
1 | #python3 |
- 其他解法如:c++解决n个整数的数列,不超过m的最大子数列和
1 |
|
4.2 矩阵乘法的Strassen算法
- c++如何创建动态二维数组:
1 |
|
- python矩阵乘法暴力破解算法
1 | def matrixMultiply(A,B): |
- 方阵乘法的简单分治算法(前提:假定A,B都是n等于2的次幂的方阵)
- python
1 | def division(a): #矩阵分块函数 |
- 矩阵乘法的Strassen算法
1 |
|
- 感谢您的赞赏
赞赏名单
你的支持是我持续创作的动力。
本文是原创文章,采用CC BY-NC-SA 4.0许可协议,完整转载请注明来自XMJ's BLOG
评论 ()



















