数据结构杂谈番外篇——时间复杂度计算

我们先给出推导的方法,然后下面一步一步来推导。

推导大O阶

  1. 用常数1取代运行时间中的所有加法常数
  2. 在修改后的运行次数函数中,只保留最高阶项
  3. 如果最高阶存在且不是1,则去除这个项相乘的常数
  4. 所得结果即为大O阶

示例

int sum = 0,n = 100; //以分号结尾,代码执行一次
sum = (1+n)*n/2 //执行一次
cont<<sum<<endl; //执行一次

运行次数为3,而在上面推导的推导大O阶方法中我们说了,用1代码所有的加法,什么意思呢?我们的3是经过1+1+1算出来的,我们用1代替所有的加法。而这个表达式只有1,没有最高阶项,所以结果1即为大O阶。我们把具有O(1)的时间复杂度的叫做常数阶

int i;
for(i = 0;i<n;i++)
{/*其他常数阶程序代码*/
}

我们可以发现,花括号里的就是常数阶,而for循环循环了n次,也就是说,做了n+常数阶次执行次数,根据上面推导大O阶方法,我们找到了最高阶项n,舍弃后面常数项,所以我们的时间复杂度为O(n),我们把这类情况称为线性阶

顺便一提,一般来说,我们分析算法的时间复杂度,关键就是分析循环结构的运行情况

int count = 1;
while(count < n)
{count = count * 2;/*其他常数阶程序代码*/
}

从这里的代码我们可以看出,退出循环的条件是count<n,而count是通过自身乘2来更新自我然后跳出循环的。也就是说,设count更新次数为x,其可以写出2x=n2^{x}=n2x=n的式子,而我们大O(n)里面的n实际上指的是这里的x,根据高中数学所学的指对互换,我们可以写出x=log2nx = log_2nx=log2n。所以这个循环的时间复杂度为O(logn),我们把这类情况叫做对数阶

int i ,j ; 
for (i - 0; i < n; i++) {for ( j - 0 ; j < n ; j++ ){/*时间复杂度为O(1)的程序步骤序列*/}
}

对于这种就不必多说了,时间复杂度为O(n2)(n^2)(n2)。我们把这类情况叫做平方阶

说完上面所有的情况了,现在我们来几个题来练手。

x = 0;y = 0;
for(int k = 0;k<n;k++){x++;
}
for(int i = 0;i<n;i++){for(int j = 0;j<n;j++){y++;}
}

分析算法,根据推导大O阶方法,第一行执行1次,第一个循环执行n次,第一个内嵌循环外层n次,内层n次,也就是n的平方。把常数变为1,然后抓大头,最高项系数为1,那么只剩下n2n^2n2。所以该代码的时间复杂度为O(n2)(n^2)(n2),从完整的代码分析下来我们也可以发现,实际上我们只需要找最复杂的那个循环开始分析就可以了,因为其他的代码所含的时间复杂度最终根据推导大O阶方法都会被省略。下面看一个比较难的例子。

void exam(fload x[][],int m,int n)
{float sum[];for(int i = 0;i<m;i++){sum[i] = 0.0;for(int j = 0;j<n;j++){sum[i]+=x[i][j];}}for(i = 0;i<m;i++)cout<<i<<":"<<sum[i]<<endl;
}

最复杂的就是中间的内嵌循环,外层循环为从0到m,内层循环0到n,所以该时间复杂度应为O(m+n)。

for(i = 1;i<=n;i++)for(j = 1;j<=n;j++){c[i][j]=0;for(k = 1;k<=n;k++)c[i][j] = c[i][j]+a[i][k]*b[k][j];}

上面这个是一个N×N矩阵相乘的算法,连续三层循环,第一次执行次数为n,第二层执行次数也为n,第三层执行次数还是n。所以该题算法复杂度为O(n3)(n^3)(n3)

for(i = 1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x = x+1;

这里最外层执行次数n,但是最外层执行1次,第二层就循环1次;最外层执行第2次,第二层循环两次;根据等差数列求和公式,即第二层有1+2+3+…+n,即n(1+n)2\frac{n(1+n)}{2}2n(1+n)次。当然第三层就不好理解了,所以我们接下来换一种方法。

对于三层循环问题,我们还是直接列出最外层的前几项比较好。在i = 1的时候,内层循环全部加起来只循环一次。在i = 2的时候,第二层循环启动两次循环,所以总共执行1+2,对于i = 3,第二层启动三次循环,第三层也是三次循环。也就是说总共执行1+2+3。如果听不太懂,我们可以用图来表示,即:

image-20220112191100363

所以实际上以上规律是由n来控制的,从上面的图来看的话,根据我们所得规律,i=1里面有一个i(1+i)2\frac{i(1+i)}{2}2i(1+i),i = 2里面也有一个i(1+i)2\frac{i(1+i)}{2}2i(1+i),以此类推我们可以写出下面的式子:∑i=1ni(i+1)2\sum^n_{i=1}\frac{i(i+1)}{2}i=1n2i(i+1)

我们化简一下上面的式子:∑i=1n(i22+i2)=12∑i=1n(i2−i)\sum^n_{i=1}(\frac{i^2}{2}+\frac{i}{2}) = \frac1 2\sum^n_{i=1}(i^2-i)i=1n(2i2+2i)=21i=1n(i2i)

这里用等差求和公式带入求解,即可得出答案n(n+1)(n+2)6\frac{n(n+1)(n+2)}{6}6n(n+1)(n+2),根据我们前面说的大O阶推导,可以得出本题的时间复杂度为n3n^3n3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习笔记(二):String

String 在Java中String是作为引用对象存在的一种数据类型&#xff0c;用来保存字符串。 实例化和赋值 //直接声明 String s1 "Hello world!"; //通过构造函数创建, 提供了 11 种不同参数创建的方法 char[] c { h, e, l, l, o, .}; String s2 new String(c); Strin…

数据结构杂谈(一)

在你点进来这里的一瞬间&#xff0c;欢迎你找到了宝藏 这是一些关于数据结构和算法里最详细的阐述和学习心得&#xff0c;我十分乐意和你分享这些知识。 如果你已经看完这篇杂谈&#xff0c;可以前往下一篇→数据结构杂谈&#xff08;二&#xff09;_尘鱼好美的小屋-CSDN博客 1…

计算器排html页面,htmltest~计算器界面的实现

通过divcss和部分布局的作用&#xff0c;实现了&#xff0c;如下效果的计算器展示页面![C%]R$IGDK4J(%3LJXD3]SY.png&#xff0c;废话不多说&#xff0c;最主要的还是分享代码&#xff1a;html&#xff1a;Title.计算器-口 X编辑(E)查看(V)帮助(H)BackspaceCECMC789/sqrtMR456*…

win7 git 添加 ssh key

分两步走&#xff0c;借助git bash客户端&#xff1a;第一步&#xff1a;生成秘钥创建SSH key. 在用户主目录下&#xff0c; 看看有没有.ssh目录&#xff0c; 如果有&#xff0c; 再看看这个目录下有没有id_rsa 和 id_rsa.pub 这两个文件&#xff0c; 如果已经有了&#xff0c;…

解决三星手机EditText背景色的问题

问题描述android:background"#ffffff"其他手机手机背景都是白色&#xff0c;三星却是黑色的。怎么办 解决方案1写个主题测试下 解决方案2检查是三星的手机换背景色解决方案3你自己设置下edittext的背景就好了 解决方案4三星手机没这bug&#xff0c;你的固件不是正常的…

操作系统随笔(二)

如果你还没有读过第一篇随笔&#xff0c;请点击这里→操作系统随笔&#xff08;一&#xff09; 文章目录[toc]2 进程和线程2.1 进程2.1.1 进程模型2.1.2 进程的创建2.1.3 进程的终止2.1.4 进程的层次结构2.1.5 进程的状态2.1.6 进程的实现2.2 线程2.2.1 进程的使用2.2.2 经典的…

golang实现常用数据结构

2019独角兽企业重金招聘Python工程师标准>>> 1.数组栈的实现 package mainimport ( "fmt")type ItemType inttype Stack struct { node [10]ItemType maxsize int top int}func StackInit(p *Stack) { p.top -1}func StackCheckFull(p *Stack) bo…

【问题解决】无法创建新的堆栈防护页面

【问题发现】 项目中需要几个自定义的控件,菜鸟D定义了一个接口,打算使用多态来统一调用。在完成两个自定义控件后&#xff0c;项目都能正常运行。但是在第三个控件使用的时候就出了问题&#xff1a;将控件拖到界面上以后&#xff0c;不能拖动改变控件的宽度&#xff0c;一拖动…

java及python调用RabbitMQ

1,python调用MQ发送消息(生产者),话不多说,直接上干货 import pika 如下图 2.java调用MQ发送消息(生产者) 具体代码如下: python 的代码如下 connection pika.BlockingConnection(pika.ConnectionParameters(IP,端口,/))channel connection.channel()msg_props pika.Bas…

html知识收集(一)

1.页内跳转iframe <ul> <li><a href"1.html" target"iframe1">1</a></li> <li><a href"2.html" target"iframe1">2</a></li> </ul> </ul> <iframe name"i…

设定Word段落的背景色

段落背景不同于文字区别。很多新接触word的朋友都找不到怎么弄。 先把光标停留在需要设置的段落文字上&#xff0c;或者选择需要设置的段落文字。 点击段落里的边框和底纹&#xff0c;如图 在弹出框中选择底纹。 选择需要填充的颜色&#xff0c;在左下角处把文字切换成段落。…

Hadoop随笔(二)

文章目录[toc]2 Hadoop概念2.1 Hadoop简介2.2 MapReduce编程模型简介2.3 Hadoop系统的组成2 Hadoop概念 面对大数据量的处理需求&#xff0c;一个常用的方法就是把它们分割成互不依赖的小份数据来分别计算处理&#xff0c;这就是所谓的单指令多数据流(SIMD)的数据计算模式。Ha…

HDU 5102 The K-th Distance

题意&#xff1a;给你n-1条边&#xff0c;然后没两个节点的距离按照递增的顺序&#xff0c;求出前k项的和。 官方题解&#xff1a; 把所有边(u,v) 以及(v,u)放入一个队列&#xff0c;队列每弹出一个元素(u,v)&#xff0c;对于所有与u相邻的点w&#xff0c;如果w!v&#xff0c;就…

spring AOP 之五:Spring MVC通过AOP切面编程来拦截controller

示例1&#xff1a;通过包路径及类名规则为应用增加切面 该示例是通过拦截所有com.dxz.web.aop包下的以Controller结尾的所有类的所有方法&#xff0c;在方法执行前后打印和记录日志到数据库。 新建一个springboot项目 1&#xff1a;首先定义maven <?xml version"1.0&q…

数据结构杂谈(二)

本文的所有代码均由C编写 如果你已经看完这篇杂谈&#xff0c;可以前往下一篇→数据结构杂谈&#xff08;三&#xff09;_尘鱼好美的小屋-CSDN博客 文章目录2 顺序表2.1 线性表的类型定义2.2 类C语言有关操作补充2.2.1 ElemType的解释2.2.2 数组定义2.2.3 建立链表可能会用到的…

2月份Web服务器份额:排名不变 仅Microsoft份额上扬

IDC评述网&#xff08;idcps.com&#xff09;02月29日报道&#xff1a;近日&#xff0c;Netcraft公布了全球Web服务器最新数据。根据显示&#xff0c;2016年2月&#xff0c;Netcraft收到调查的网站共计933,892,520家&#xff0c;相比上月增加3%。在全球主流Web服务器市场上&…

每日一题——剑指offer18单链表的删除

如果您是第一次看我写的博客&#xff0c;可以给我点个赞并关注我吗&#xff0c;我会持续分享更多有意思的干货。 每日一题系列从今天开始&#xff0c;由于我是个算法小白&#xff0c;所以我会给你看看小白是怎么学的。&#x1f487; 文章目录1 题目2 思路3 代码4 小结1 题目 剑…

王道操作系统考研笔记——1.1.1 操作系统的概念、功能和目标

如果这篇博客对您有用的话&#xff0c;可以给我点个赞吗&#xff0c;这对我很重要&#xff0c;谢谢&#xff01;❤️ 文章目录1.1.1 操作系统的概念、功能和目标1.1.1.1 操作系统的概念1.1.1.2 作为系统资源的管理者1.1.1.3 作为用户和计算机硬件之间的接口1.1.1.4 作为最接近硬…

《从零开始学Swift》学习笔记(Day 8)——小小常量、变量大作用

原创文章&#xff0c;欢迎转载。转载请注明&#xff1a;关东升的博客计算机语言学习中都有常量和变量&#xff0c;他们几乎是我编写代码的灵魂了&#xff0c;离开他们我真的是“活不了”常量是标识符的前面加上关键字let。常量其值在使用过程中不会发生变化的量&#xff0c;下面…

王道操作系统考研笔记——1.1.2 操作系统的特征

如果这篇博客对您有用的话&#xff0c;可以给我点个赞吗&#xff0c;这对我很重要&#xff0c;谢谢&#xff01;❤️ 1.1.2 操作系统的特征 文章目录1.1.2 操作系统的特征1.1.2.1 并发1.1.2.2 共享1.1.2.3 并发和共享的关系1.1.2.4 虚拟1.1.2.5 异步1.1.2.6 小结我们接下来讲的…