函数渐近界与算法性能分析_渐进下界怎么求_梦未的博客-程序员宅基地

技术标签: 算法  # 数据结构与算法  数学  

渐近界与渐进函数简介

函数渐近界实际上算是一个集合,用来表示函数的边界或范围的集合

可以按大小/量级区分为:上界(高阶),平均界(同阶),下界(低阶)

image-2022609214958

再根据是否渐进区分(有没有可能相等)

一般来讲,用于表示函数渐近界的渐进符号有五个:

  • 平均界(average bound)/渐进确界(asymptotically tight bound):θ
  • 渐进上界(upper bound):O
  • 渐进下界(lower bound):Ω
  • 非渐进紧确上界:o
  • 非渐进紧确下界:ω

注释

o ( g ( x ) ) o(g(x)) o(g(x))是一个集合, 所以实际上 f ( x ) ∈ o ( g ( x ) ) f(x) \in o(g(x)) f(x)o(g(x))

通常我们记作 f ( x ) = o ( g ( x ) ) f(x)=o(g(x)) f(x)=o(g(x)) 以表达相同的概念, 其它几个记号同理.

可以理解为:

  • f ( x ) = O ( g ( x ) ) ⟹ f ( x ) ≤ g ( x ) f(x)=O(g(x)) \Longrightarrow f(x) \leq g(x) f(x)=O(g(x))f(x)g(x)
  • f ( x ) = o ( g ( x ) ) ⟹ f ( x ) < g ( x ) f(x)=o(g(x)) \Longrightarrow f(x) < g(x) f(x)=o(g(x))f(x)<g(x)
  • f ( x ) = Ω ( g ( x ) ) ⟹ f ( x ) ≥ g ( x ) f(x)=\Omega(g(x)) \Longrightarrow f(x) \geq g(x) f(x)=Ω(g(x))f(x)g(x)
  • f ( x ) = ω ( g ( x ) ) ⟹ f ( x ) > g ( x ) f(x)=\omega(g(x)) \Longrightarrow f(x) > g(x) f(x)=ω(g(x))f(x)>g(x)
  • f ( x ) = θ ( g ( x ) ) ⟹ f ( x ) ≈ g ( x ) f(x)=\theta(g(x)) \Longrightarrow f(x) \approx g(x) f(x)=θ(g(x))f(x)g(x)

高等数学中的例子

举一个高等数学中的例子:

α ( x ) \alpha(x) α(x) β ( x ) \beta(x) β(x) 的高阶无穷小,也就是 lim ⁡ α ( x ) β ( x ) = 0 \displaystyle{\lim\limits{\frac{\alpha(x)}{\beta(x)}}=0} limβ(x)α(x)=0

那么记为: α ( x ) = o ( β ( x ) ) \alpha(x)=o(\beta(x)) α(x)=o(β(x)),可以理解为 β ( x ) \beta(x) β(x) α ( x ) \alpha(x) α(x) 的非渐进紧确上界

函数阶的例子

再以函数阶举例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SL7UayQ2-1673949573802)(https://image.dreature.xyz/images/post/image-2022609215309-1654785393614.png)]

image-20221129194855799

任取图上两个函数 a = f ( n ) a=f(n) a=f(n) b = g ( n ) b=g(n) b=g(n) ,只要 a a a b b b 的左边,那都可以说:

  • a = O ( b ) a=O(b) a=O(b) a = o ( b ) a=o(b) a=o(b)
  • b = Ω ( a ) b=\Omega(a) b=Ω(a) b = ω ( a ) b=\omega(a) b=ω(a)

运用于算法性能分析

渐近界的概念经常被用于算法性能分析中,当参数 n n n 趋于无穷的时候,各个算法(函数)孰优孰劣一看便知

对于两个算法的成本函数(时间、空间等) f ( n ) f(n) f(n) g ( n ) g(n) g(n),谁更低阶谁性能更优

  • lim ⁡ n → ∞ f ( n ) g ( n ) = c \lim\limits_{n\to\infty}\frac{f(n)}{g(n)}=c nlimg(n)f(n)=c,则 f ( n ) = θ ( g ( n ) ) f(n)=\theta(g(n)) f(n)=θ(g(n)),二者性能相当
  • lim ⁡ n → ∞ f ( n ) g ( n ) = 0 \lim\limits_{n\to\infty}\frac{f(n)}{g(n)}=0 nlimg(n)f(n)=0,则 f ( n ) = o ( g ( n ) ) f(n)=o(g(n)) f(n)=o(g(n)) f ( n ) f(n) f(n) 算法更优
  • lim ⁡ n → ∞ f ( n ) g ( n ) = ∞ \lim\limits_{n\to\infty}\frac{f(n)}{g(n)}=\infty nlimg(n)f(n)=,则 f ( n ) = ω ( g ( n ) ) f(n)=\omega(g(n)) f(n)=ω(g(n)) g ( n ) g(n) g(n) 算法更优

比如对于冒泡排序算法而言

  • 冒泡排序伪代码
(输入N个待排序的数,其中的第i个数可用a[i]表示)
定义一个i,i的值从N到2递减,对于每个i:
         定义一个j,j的值从1到i-1递增,对于每个j:
                  如果a[j]>a[j+1]:
                          将a[j]和a[j+1]的值交换
  • 冒泡排序流程图

image-2022030123311002

  • 冒泡排序过程动图

image-2022030123311003

冒泡的平均时间复杂度是 O ( n 2 ) O(n^2) O(n2),这意味着排序 n n n 个数据,平均需要耗费 n 2 n^2 n2 量级的时间

其他算法的复杂度如下图

image-2022030123311004

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42077074/article/details/125212841

智能推荐

Visual Studio制作小型计算器_chouherou4683的博客-程序员宅基地

打开Visual Studio工具,新建一个window应用窗体。步骤如下: 确定后出现了我们第一个窗体Form1。我们就在这制作小型计算器,出现的界面如下: 修改下form1的名称。右键上面的窗体打开属性,找到Text属性,把form1改为...

C语言函数与模块化程序设计_大暑这天开通了博客的博客-程序员宅基地

1.函数的定义1.函数的分类(1)标准库函数(2)自定义函数2.函数的定义自定义的一系列函数。一般形式:返回值类型 函数名(类型 形式参数1 , 类型 形式参数2,。。。)|声明语句序列可执行语序序列|函数定界符–花括号 { },函数内部定义的变量只能再函数体内访问,称为内部变量。头部参数里面的变量,称为形式参数。2.向函数传递和从函数返回值1.函数的调用(1)函数必须通过main()间接或者直接发挥作用。因此就涉及到函数调用的问题。main 函数调用时 必须提供一个称为实际参

django用户邮箱激活流程_The Winslow Accord的博客-程序员宅基地

1.在setting.py中添加配置邮箱信息:EMAIL_BACKEND = ‘django.core.mail.backends.smtp.EmailBackend’EMAIL_HOST = ‘smtp.163.com’ #服务器EMAIL_PORT = 25 #端口,一般情况下都为25EMAIL_HOST_USER = ‘[email protected]’ ...

launch文件用法_lichunhong000的博客-程序员宅基地

launch文件用法https://www.cnblogs.com/CZM-/p/5943821.htmllaunch 在ROS应用中,每个节点通常有许多参数需要设置,为了方便高效操作多个节点,可以编写launch文件,然后用roslaunch命令运行 roslaunch: roslaunch [options] [package] [arg_name:=value…] rosla...

ConneR and the A.R.C. Markland-N--- codeforces1293A_fisht ank的博客-程序员宅基地

A.R.C. Markland-N is a tall building with n floors numbered from 1 to n. Between each two adjacent floors in the building, there is a staircase connecting them.It’s lunchtime for our sensei Colin “Co...

随便推点

关于付费专栏订阅模式调整的说明_csdn付费专栏文章设置为试读什么意思_LaoYuanPython的博客-程序员宅基地

老猿目前开通了2个付费专栏,付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏以前在CSDN上只需订阅一次即都可以阅读,最近CSDN的版本进行了更新,支持分专栏订阅,因此老猿的付费专栏在10月10日进行了订阅模式调整,订购分专栏进行,订购哪个专

CCF 认证 201812-4 数据中心(100分)_201812-4 试题名称:数据中心_DeathYmz的博客-程序员宅基地

CCF 认证 201812-4 数据中心(100分)被12月CCF认证的成绩打击了好久之后,官网出题之后,对自己第四题不相信0分,注释了freopen之后交了一次。100分。这就非常扎心了。但是还是给了我信心,至少刷题没有白费功夫,还是太粗心了。下次继续!!!   题编号: 201812-4 试题名称: 数据中心 时间限制: 1.0s 内存...

谷歌怎么设置下载位置_binghongcha11的博客-程序员宅基地

1、打卡右上角的设置2.向下滑动点击高级3.找到下载内容-&gt;位置,点击更改选择要更改的地址,就好了

Java实现隐藏手机、身份证中间字符_Jerry.zh的博客-程序员宅基地

手机号隐藏中间四位String phone = &quot;13688886666&quot;;phone = phone.replaceAll(&quot;(\\d{3})\\d{4}(\\d{4})&quot;,&quot;$1****$2&quot;);实现效果136****6666身份证号隐藏中间字符String cardId = &quot;420388888888886666&quot;;cardId = cardId.replaceAll(&quot;(...

android 刷路由器,荣耀立方WS860s路由器完整刷机包怎么使用?荣耀立方刷机图文教程..._其实我是老莫的博客-程序员宅基地

荣耀立方是一款功能强大的路由器, 荣耀立方也是一做成智能路由+NAS+电视盒三合一的产品。荣耀立方WS860S官方刷机包方便荣耀立方的用户升级或者还原成原厂系统。今天小编为大家带来荣耀立方刷机图文教程软件名称:荣耀立方WS860s路由器完整刷机包 B227 官方稳定版软件大小:310MB更新时间:2015-08-24立即下载荣耀立方刷机教程:更新PC硬盘管理工具一、U盘或者SD卡升级l升级注意...

Linux下的ping命令_weixin_33978016的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

推荐文章

热门文章

相关标签