【见解】关于算法复杂度的理解不能只停留在根据代码直接凭感官或者经验直接推测其公式(例如:根据for循环直接推测出一个O(n)复杂度,关于复杂度的理解更应该深入到其所代表的函数空间中去。

1.渐进记号


渐进记号:用来描述算法渐进运行时间的记号,其定义域为自然数集合N={0,1,2,3...}N=\{0,1,2,3...\}N={0,1,2,3...}。
【渐进记号可刻画算法的运行时间, 也可以刻画算法的某个其他方面(例如,算法的空间数量),甚至可以是和算法没有任何关系的函数。】

1.1 Θ\ThetaΘ记号

【定义】
用 Θ(g(n))\Theta(g(n))Θ(g(n))来表示以下函数的集合:Θ(g(n))={f(n):存在正常量c1,c2和n0,使得对所有n≥n0,有0≤c1∗g(n)≤f(n)≤c2∗g(n)}\Theta(g(n)) = \{f(n):存在正常量c_1, c_2 和n_0,使得对所有 n\ge n_0, 有 0 \leq c_1*g(n) \leq f(n) \leq c_2*g(n)\}Θ(g(n))={f(n):存在正常量c1​,c2​和n0​,使得对所有n≥n0​,有0≤c1​∗g(n)≤f(n)≤c2​∗g(n)}
该记号渐近得给出一个函数的上界和下界。

【谨记】
Θ(g(n))\Theta(g(n))Θ(g(n))表示的是一个集合,可以记f(n)∈Θ(g(n))f(n)\in\Theta(g(n))f(n)∈Θ(g(n)) 用来指出f(n)是Θ(g(n))的成员f(n)是\Theta(g(n))的成员f(n)是Θ(g(n))的成员。 Θ(g(n))\Theta(g(n))Θ(g(n))的定义要求每个成员f(n)∈Θ(g(n))f(n)\in \Theta(g(n))f(n)∈Θ(g(n))均为渐近非负,即当nnn足够大时, f(n)f(n)f(n)非负。【渐近非负性对于其他渐近符号也成立】
因为任意常量是一个0阶多项式, 随意可以把任意常量函数表示成Θ(n0)或Θ(1)\Theta(n^0)或\Theta(1)Θ(n0)或Θ(1)

[练习1.1]
1.1 假设f(n)与g(n)都是渐进非负函数, 使用Θ\ThetaΘ 记号的基本定义来证明 max⁡(f(n),g(n))=Θ(f(n)+g(n))\max(f(n), g(n))= \Theta(f(n) +g(n)) max(f(n),g(n))=Θ(f(n)+g(n))
解: 根据定义,要使上述条件成立,只需存在正常数c1,c2,n0c_1, c_2, n_0c1​,c2​,n0​, 使得对于所有的n≥n0n\ge n_0n≥n0​:c1∗(f(n)+g(n))≤max⁡(f(n),g(n))≤c2∗(f(n)+g(n))成立c_1*(f(n) + g(n)) \leq\max(f(n), g(n)) \leq c_2* (f(n) + g(n)) 成立c1​∗(f(n)+g(n))≤max(f(n),g(n))≤c2​∗(f(n)+g(n))成立
对于右边的不等号明显可知f(n)+g(n)f(n)+g(n)f(n)+g(n)恒大于其中之一,可取c1=1c_1=1c1​=1
对于左边的不等号,由于f(n)和g(n)f(n)和g(n)f(n)和g(n)具有交换性(因其无明确定义),假设f(n)≤g(n)f(n)\leq g(n)f(n)≤g(n),则在c1=12c_1 = \frac{1}{2}c1​=21​时成立
则 对于c1=1,c2=12,n0∈Nc_1 = 1, c_2 = \frac{1}{2}, n_0 \in Nc1​=1,c2​=21​,n0​∈N,上式均成立。得证。

[练习1.2]
1.2 证明:对于任意实常量 aaa 和 bbb , 其中 b≥0b\ge 0b≥0,有
(n+a)b=Θ(nb)(n + a)^b = \Theta(n^b)(n+a)b=Θ(nb)
解: 根据定义,要使上述条件成立,只需存在正常数c1,c2,n0c_1, c_2, n_0c1​,c2​,n0​, 使得对于所有的n≥n0n\ge n_0n≥n0​:c1∗(nb)≤(n+a)b≤c2∗(nb)成立c_1*(n^b) \leq (n + a)^b \leq c_2* (n^b) 成立c1​∗(nb)≤(n+a)b≤c2​∗(nb)成立
对于左边的不等号取其log对数 ⇒(lg(c1)+b∗lgn)≤b∗lg(n+a)⇒lg(c1)≤b∗lg(1+an)\Rightarrow (lg(c_1) + b*lg n) \leq b*lg(n + a) \Rightarrow lg(c_1) \leq b*lg(1 + \frac{a}{n})⇒(lg(c1​)+b∗lgn)≤b∗lg(n+a)⇒lg(c1​)≤b∗lg(1+na​)
对于右边的不等号取其log对数, ⇒b∗lg(n+a)≤(lg(c2)+b∗lgn)⇒lg(c2)≥b∗lg(1+an)\Rightarrow b*lg(n + a)\leq (lg(c_2) + b*lg n) \Rightarrow lg(c_2)\ge b*lg(1 + \frac{a}{n})⇒b∗lg(n+a)≤(lg(c2​)+b∗lgn)⇒lg(c2​)≥b∗lg(1+na​)
假设 n0≥2∣a∣n_0 \ge 2|a|n0​≥2∣a∣,讨论:
(1)当a≥0a\ge 0a≥0 时, b∗lg(1+an)≥0b*lg(1 + \frac{a}{n}) \ge 0b∗lg(1+na​)≥0 ,则此时取c1=1c_1 =1c1​=1
b∗lg(1+an)≤b∗lg2,取c2=2bb*lg(1 + \frac{a}{n}) \leq b*lg2, 取c_2 = 2^bb∗lg(1+na​)≤b∗lg2,取c2​=2b
(1)当a&lt;0a &lt; 0a<0 时, b∗lg(1+an)&lt;0b*lg(1 + \frac{a}{n}) &lt; 0b∗lg(1+na​)<0 ,则此时取c2=1c_2 =1c2​=1
b∗lg(1+an)≥b∗lg(12),取c1=2−bb*lg(1 + \frac{a}{n}) \ge b*lg(\frac{1}{2}), 取c_1 = 2^{-b}b∗lg(1+na​)≥b∗lg(21​),取c1​=2−b
综上,对于任意实常量 aaa 和 bbb , 其中 b≥0b\ge 0b≥0,均存在正常数c1,c2,n0c_1, c_2, n_0c1​,c2​,n0​, 使上式成立,得证。

1.2 O记号

Θ\ThetaΘ记号渐近得给出一个函数的上界和下界。O记号在只有一个渐近上界时使用。

【定义】
用 O(g(n))O(g(n))O(g(n))来表示以下函数的集合:O(g(n))={f(n):存在正常量c和n0,使得对所有n≥n0,有0≤f(n)≤c∗g(n)}O(g(n)) = \{f(n):存在正常量c 和n_0,使得对所有 n\ge n_0, 有 0 \leq f(n) \leq c*g(n)\}O(g(n))={f(n):存在正常量c和n0​,使得对所有n≥n0​,有0≤f(n)≤c∗g(n)}
因为Θ\ThetaΘ记号是一个比OOO记号更强的约束概念,所以有Θ(g(n))⊆O(g(n))\Theta(g(n))\subseteq O(g(n))Θ(g(n))⊆O(g(n))

既然OOO记号描述的上界,适合用来描述算法运行时间执行的最坏的情况(例如:插入排序的最坏运行时间的界为O(n2)O(n^2)O(n2)),该O(n2)O(n^2)O(n2)界也适用于该算法对每个输入的运行时间。但是,对于插入排序的最坏情况运行时间的界Θ(n2)\Theta(n^2)Θ(n2)并未暗示着其对每个输入的运行时间的界也是Θ(n2)\Theta(n^2)Θ(n2),例如当输入已经排好序的情况下,插入排序的运行时间为Θ(n)\Theta(n)Θ(n)。

1.3 Ω\OmegaΩ记号

OOO记号渐近得给出一个函数的渐近上界,Ω\OmegaΩ记号给出一个函数的渐近下界

【定义】
用 Ω(g(n))\Omega(g(n))Ω(g(n))来表示以下函数的集合:Ω(g(n))={f(n):存在正常量c和n0,使得对所有n≥n0,有0≤c∗g(n)≤f(n)}\Omega(g(n)) = \{f(n):存在正常量c 和n_0,使得对所有 n\ge n_0, 有 0 \leq c*g(n)\leq f(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)和g(n),有f(n)=Θ(g(n))f(n) = \Theta(g(n))f(n)=Θ(g(n)),当且仅当f(n)=O(g(n))且f(n)=Ω(g(n))f(n) = O(g(n))且f(n) = \Omega(g(n))f(n)=O(g(n))且f(n)=Ω(g(n))。

1.4 ooo记号

由OOO(大O)记号提供的渐近上界可能是也可能不是渐近紧确的(仅仅是提供了一个上界描述而已),(例如:2n2=O(n2)是渐近紧确的,但是2n=O(n2)却不是2n^2 = O(n^2)是渐近紧确的, 但是2n = O(n^2)却不是2n2=O(n2)是渐近紧确的,但是2n=O(n2)却不是。使用ooo(小o)记号来表示一个非渐近紧确的上界,形式化地定义o(g(n))o(g(n))o(g(n))为以下集合:
o(g(n))={f(n):对于任意的正常量c,存在n0&gt;0,使得对所有n≥n0,有0≤f(n)&lt;c∗g(n)}o(g(n)) = \{f(n):对于任意的正常量c ,存在 n_0&gt;0,使得对所有 n\ge n_0, 有 0 \leq f(n) &lt;c*g(n)\}o(g(n))={f(n):对于任意的正常量c,存在n0​>0,使得对所有n≥n0​,有0≤f(n)<c∗g(n)}
注意:任意…存在… 有0≤f(n)有 0 \leq f(n)有0≤f(n) < c∗g(n)c*g(n)c∗g(n),例如(2n=o(n2)2n= o(n^2)2n=o(n2),但是2n2不等于o(n2)2n^2不等于 o(n^2)2n2不等于o(n2)。

【区别】
OOO记号与ooo记号的主要区别在于:在f(n)=O(g(n))f(n) = O(g(n))f(n)=O(g(n))中,界0≤f(n)≤c∗g(n)0\leq f(n)\leq c*g(n)0≤f(n)≤c∗g(n)是对某个(存在)常量c&gt;0c&gt;0c>0成立,但在$f(n) = o(g(n))中,界0≤f(n)&lt;c∗g(n)0\leq f(n) &lt; c*g(n)0≤f(n)<c∗g(n)是对所有常量c&gt;0c&gt;0c>0均成立。
极限定义ooo记号:lim⁡n→∞f(n)g(n)=0\lim_{n \to \infty}\frac{f(n)}{g(n)}=0n→∞lim​g(n)f(n)​=0

1.5 ω\omegaω记号

ω\omegaω记号与Ω\OmegaΩ记号的关系类似于ooo记号与OOO记号之间的关系,用ω\omegaω记号来表示一个非渐近的下界。
形式化地定义ω(g(n))\omega(g(n))ω(g(n))为以下集合:
ω(g(n))={f(n):对于任意的正常量c,存在n0&gt;0,使得对所有n≥n0,有0≤c∗g(n)&lt;f(n)}\omega(g(n)) = \{f(n):对于任意的正常量c ,存在 n_0&gt;0,使得对所有 n\ge n_0, 有 0 \leq c*g(n)&lt;f(n)\}ω(g(n))={f(n):对于任意的正常量c,存在n0​>0,使得对所有n≥n0​,有0≤c∗g(n)<f(n)},关系f(n)∈o(g(n))f(n)\in o(g(n))f(n)∈o(g(n))蕴含着:lim⁡n→∞f(n)g(n)=∞\lim_{n \to \infty}\frac{f(n)}{g(n)}=\inftyn→∞lim​g(n)f(n)​=∞

2.渐进记号属性

假定f(n)和g(n)f(n)和g(n)f(n)和g(n)渐近为正

2.1 传递性

f(n)=Θ(g(n))且g(n)=Θ(h(n))f(n) = \Theta(g(n)) 且 g(n) = \Theta(h(n))f(n)=Θ(g(n))且g(n)=Θ(h(n)), 蕴含f(n)=Θ(h(n))f(n) = \Theta(h(n))f(n)=Θ(h(n))
f(n)=O(g(n))且g(n)=O(h(n))f(n) =O(g(n)) 且 g(n) = O(h(n))f(n)=O(g(n))且g(n)=O(h(n)), 蕴含f(n)=O(h(n))f(n) = O(h(n))f(n)=O(h(n))
f(n)=Ω(g(n))且g(n)=Ω(h(n))f(n) = \Omega(g(n)) 且 g(n) = \Omega(h(n))f(n)=Ω(g(n))且g(n)=Ω(h(n)), 蕴含f(n)=Ω(h(n))f(n) =\Omega(h(n))f(n)=Ω(h(n))
f(n)=o(g(n))且g(n)=o(h(n))f(n) = o(g(n)) 且 g(n) = o(h(n))f(n)=o(g(n))且g(n)=o(h(n)), 蕴含f(n)=o(h(n))f(n) = o(h(n))f(n)=o(h(n))
f(n)=ω(g(n))且g(n)=ω(h(n))f(n) = \omega(g(n)) 且 g(n) = \omega(h(n))f(n)=ω(g(n))且g(n)=ω(h(n)), 蕴含f(n)=ω(h(n))f(n) = \omega(h(n))f(n)=ω(h(n))

2.2 自反性

f(n)=Θ(f(n))f(n) = \Theta(f(n))f(n)=Θ(f(n))
f(n)=O(f(n))f(n) = O(f(n))f(n)=O(f(n))
f(n)=Ω(f(n))f(n) = \Omega(f(n))f(n)=Ω(f(n))

2.3 对称性

f(n)=Θ(g(n))当且仅当g(n)=Θ(f(n))f(n) = \Theta(g(n)) 当且仅当 g(n) = \Theta(f(n))f(n)=Θ(g(n))当且仅当g(n)=Θ(f(n))

2.4 转置对称性

f(n)=O(g(n))当且仅当g(n)=Ω(f(n))f(n) = O(g(n)) 当且仅当g(n) = \Omega(f(n))f(n)=O(g(n))当且仅当g(n)=Ω(f(n))
f(n)=o(g(n))当且仅当g(n)=ω(f(n))f(n) = o(g(n)) 当且仅当g(n) = \omega(f(n))f(n)=o(g(n))当且仅当g(n)=ω(f(n))

算法复杂度分析(渐近记号)相关推荐

  1. 算法导论 — 思考题3-4 渐近记号的性质

    (渐近记号的性质)假设f(n)f(n)f(n)和g(n)g(n)g(n)为渐近正函数.证明或反驳下面的每个猜测. a. f(n)=O(g(n))f(n) = O(g(n))f(n)=O(g(n))蕴含 ...

  2. 【天赢金创】算法复杂度分析

    原文:http://www.cnblogs.com/gaochundong/p/complexity_of_algorithms.html 为什么要进行算法分析? 预测算法所需的资源 计算时间(CPU ...

  3. 算法复杂度分析看这一篇就够了

    执行效率是算法一个非常重要的考量指标,而时间复杂度和空间复杂度则是衡量算法代码的执行效率. 为什么需要复杂度分析 通常情况下,我们可以在写完代码的情况下把程序跑一遍,通过统计.监控,就能得出算法执行的 ...

  4. 算法复杂度分析(下)

    前一篇文章算法复杂度分析(上)讲述了复杂度的大 O 表示法和几个分析原则,这篇文章我们来讲讲另外几种复杂度,最好情况时间复杂度(best case time complexity).最坏情况时间复杂度 ...

  5. 八大排序:Java实现八大排序及算法复杂度分析

    目录 QUESTION:八大排序:Java实现八大排序及算法复杂度分析 ANSWER: 一:冒泡排序 1.算法分析 2.时间复杂度分析 3.代码 二:选择排序 1.算法分析 2.时间复杂度分析 3.代 ...

  6. 网络流问题以及EK算法复杂度分析

    网络流问题以及EK算法复杂度分析 一.网络流算法 通过一个例子引入网络流问题. 现有一个自来水厂要往家里通水,自来水厂用Vs表示,家用Vt表示.从自来水厂到家之间连接了很多水管,并且中途经过很多转接点 ...

  7. 《算法导论》算法分析 5种渐近记号 Θ O o Ω ω

    当输入规模足够大,使得运行时间只与增长量级有关时,需要研究算法的渐近效率.也就是,当输入规模无限增加时,在极限中,算法的运行时间如何随着输入规模的变大而增加.本文中所用插图来自<算法导论> ...

  8. 算法:有关函数渐近的界

    文章目录 渐近界 大$O$符号 定义: 大$Ω$符号 定义: 小$o$符号 定义 小$ω$符号 定义 $Θ$符号 定义 定理 定理1 定理2 定理3 参考课程 渐近界 大OOO符号 定义:  设fff ...

  9. 算法之如何进行算法复杂度分析

    一.什么是复杂度分析? 1.数据结构和算法解决是"如何让计算机更快时间.更省空间的解决问题". 2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能. 3.分别用时间复 ...

最新文章

  1. MyBatis插件使用--分页插件与性能拦截器
  2. Xamarin Android开发实战(上册)
  3. html中contentEditable属性
  4. 大端和小端存储模式解析
  5. [demo] 微信小程序Demo:树芽读书(一个不错的书籍朗读小程序)
  6. 关注Oracle 02 财务系统的选型想说简单不容易
  7. iic总线从机仲裁_对 IIC 总线的理解、调用函数以及常见面试问题
  8. HTTP 代理服务器的设计与实现
  9. 模式识别技术是人工智能的基础技术,模式识别技术的发展潜力
  10. 装机大师无法发现linux硬盘,如何解决PE无法识别硬盘的问题
  11. 01 电阻的简介及常见电路分析
  12. 互联网早期是怎么发展起来的?
  13. 【计算机架构】计算 CPU 动态功耗 | 集成电路成本 | SPEC 基准测试 | Amdahl 定律 | MIPS 性能指标
  14. 强化学习(Reinforcement Learning)
  15. ARM + RISC-V双核锁步DCLS Lockstep技术总结
  16. Mysql数据库的引擎介绍
  17. 计算机教学的素质目标,课堂教学素质目标【试论教师的专业素质与中学计算机课堂教学】...
  18. 7-5 分钟秒钟的时间相减 (10 分)
  19. CPU、GPU的设计工作原理
  20. 在线CentOS7镜像源 mirrorlist.centos.org/?release=7arch=x86_64repo=osinfra=stock

热门文章

  1. 网易笔试题:地牢逃脱
  2. sql注入(最简单的注入)
  3. JAVA开发的23种设计模式之 —  装饰器模式 代理器模式
  4. Visual Studio 2022 创建 WCF服务 找不到
  5. 谷歌Adwords竞价广告效果怎么样?怎么做好Adwords?
  6. 年底了,感谢大家2022年的支持,虚竹哥送10本JAVA好书
  7. 马克思为何拒绝极限论?
  8. webservice之实现天气预报
  9. Linux服务---DNS的正向解析和反向解析
  10. sql语句中with as 的用法