关于程序的运算时间复杂度的一点思考

来源:互联网 发布:乌云镜像 知乎 编辑:程序博客网 时间:2024/05/21 20:30

时间复杂度

一般考察算法的复杂度,我们常用到时间复杂度,和空间复杂度来定义。其中时间,其实就是计算机执行这个算法执行的指令次数,是一个计算量的概念;而空间复杂度是指执行这个算法所需的内存空间,即寄存器的资源。
这篇博客主要探讨一下自己关于时间复杂度的一些思考。

几个例子

这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述

对比上述四个例子,可以发现,程序的时间复杂度和基本操作被执行的次数有关。这里很重要的一点是:基本操作。其实for循环,每次执行,都有两个基本操作,比较和++,所以即使for语句里没有任何操作,也会有两个基本操作。for循环里,如果有类似的基本操作,程序的运行时间不会改变太多。但是一旦循环里有比较复杂的操作,如pow操作,这个操作就成为基本操作,也是for循环里最耗费时间的。但看这个语句,其实看不出它有多复杂,但是从运行结果来看,它使程序运行时间提高了二十多倍,可见pow操作的执行时间远远大于赋值、比较等操作的时间。其本质我估计是单个pow操作所需要的汇编指令个数远远大于赋值、比较等操作需要的汇编指令个数。

这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述

对比这三个,有以下思考:但看执行次数,这三个和上面的执行次数是一样的,但是运行时间是上面的1.5倍,即使执行的基本操作一样。那为何运行时间是上面的1.5倍呢,我估计是因为当for循环里的循环次数比较大时,每次比较或者++运算会耗费更多时间。

另外,当循环里的总数写成N* N和4e8,执行时间是不一样的,这个很容易理解,因为每次比较,都要先计算一下N*N,这个计算本身就引入了一个比较大的基本操作,所以运行时间会多点。

这里写图片描述
这里写图片描述

当for循环里的基本操作从2个变成12个时,整体运行时间也从3秒变成18秒,可见循环执行次数和基本操作决定了整个时间复杂度。

以上是我的思考,有不对的,欢迎指正。

0 0
原创粉丝点击