《算法设计与分析》一一2.2 函数的渐近增长率

简介: 本节书摘来自华章出版社《算法设计与分析》一 书中的第2章,第2.2节,作者:黄宇 著 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.2 函数的渐近增长率

根据1.3节的定义,算法的最坏情况时间复杂度是规模n的函数。由于n是一个变量,这就给比较算法的优劣带来一个问题:算法1和算法2在规模值n取不同值的时候,它们的优劣可能是不一样的。常见的情况是,有一些复杂的算法在小规模的时候无优势甚至有劣势,但是它们的优势将在问题规模很大的时候显现出来。我们在进行算法分析的时候,更关心问题规模很大时算法的表现。但是何谓规模大,对于不同的算法而言又千差万别。有的算法可能在几千的规模上就比同类算法有优势,而有的算法可能需要到百万级的规模才能显现优势。
正是针对算法分析中的上述困难,我们引入函数的渐近增长率(asymptotic growth rate)概念,其中:
●增长率的概念使得我们集中关注算法在规模较大时候的性能表现,它关注的不是代价函数的具体的值,而是代价函数的值随规模增长的速度。因而不管开始的优劣如何,增长率较快的函数在面对大规模输入的时候值会变得更大。
●渐近的概念帮我们处理了不同算法对于 “大规模”的含义有不同解读的问题,它关注的是问题规模趋于无穷时算法代价的变化情况。
我们引入3组共5个不同的记号来描述函数的渐近增长率之间的关系,它们是O和o 、Ω 和ω 、Θ。我们首先给出使用极限语言的定义,在此基础上给出基于求极限的判别方法。在这3组记号中,O和o的定义是基础,这两个符号之间的差别是理解其定义的重点。首先给出这两个记号的定义。
定义2.2(f(n)=O(g(n)))
●O(g(n)) ={f(n):存在常数c>0和n0>0,满足0≤f(n)≤cg(n)对所有n≥n0均成立}。
●f(n)=O(g(n)) iff limn→∞f(n)g(n)=c<∞。
定义2.3(f(n)=o(g(n)))
●o(g(n)) ={f(n):对任意常数c>0,均存在常数n0>0,满足0≤f(n)●f(n)=o(g(n)) iff limn→∞f(n)g(n)=0。
不严格地说,f(n)=O(g(n))描述的是当问题规模充分大的时候,函数f(n)的增长率不会超过g(n)的增长率。与记号O(g(n))相比,f(n)=o(g(n))虽然同样表示函数f(n)的增长率不会超过g(n)的增长率,但是它的要求更强。f(n)=o(g(n))强调函数f(n)和g(n)在增长率方面有一种“实质性的差距”:总可以通过增加问题规模n,使得函数f(n)和g(n)之间有任意大的差距。
与上述定义对偶,我们有下面两个定义。
定义2.4(f(n)=Ω(g(n)))
●Ω(g(n)) ={f(n):存在常数c>0和n0>0,满足0≤cg(n)≤f(n)对所有n≥n0均成立}。
●f(n)=Ω(g(n)) iff limn→∞f(n)g(n)=c>0(c也可以为∞)。
定义2.5(f(n)=ω(g(n)))
●ω(g(n)) ={f(n):对任意常数c>0,均存在常数n0>0,满足0≤cg(n)●f(n)=ω(g(n)) iff limn→∞f(n)g(n)=∞。
与O和o的定义对偶,f(n)=Ω(g(n))描述的是随着问题规模的增大,函数f(n)的增长率不会低于g(n)的增长率;而f(n)=ω(g(n))同样强调函数f(n)和g(n)在增长率方面有一种“实质性的差距”:总可以通过规模n的增大,使得f(n)和g(n)有任意大的差距。
另外,我们可以定义f(n)=Θ(g(n)),它表示f(n)和g(n)的增长率处于“同一水平”。
定义2.6(f(n)=Θ(g(n)))
●Θ(g(n)) ={f(n):存在常数c1>0,c2>0和n0>0,满足0≤c1g(n)≤f(n)≤c2g(n)对所有n≥n0均成立}。
●f(n)=Θ(g(n)) iff limn→∞f(n)g(n)=c,这里 0根据上述定义,我们很容易验证:
●O、Ω、Θ、o、ω这5种关系均满足传递性。
●O、Ω、Θ这3种关系满足自反性。
●Θ是一个等价关系。
●f(n)=Θ(g(n)) iff f(n)=O(g(n))且f(n)=Ω(g(n))。
●O、 o和Ω、ω之间有一种对偶的关系,即f=O(g) iff g=Ω(f),f=o(g) iff g=ω(f)。
这些性质的证明留作习题。

相关文章
|
10月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
233 67
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
114 0
|
机器学习/深度学习 搜索推荐 算法
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
158 0
|
12月前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
147 3
|
算法
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
|
算法 Java C语言
Java中的算法与C语言中的函数
Java中的算法与C语言中的函数
88 2
|
算法 调度 C++
【调度算法】共享函数vs拥挤距离
【调度算法】共享函数vs拥挤距离
257 1
|
算法 Python
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
|
算法 安全 数据安全/隐私保护
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
|
算法 vr&ar
技术好文共享:遗传算法解决函数优化
技术好文共享:遗传算法解决函数优化

热门文章

最新文章