for(int i=1;i<=100;i++)

作为程序猿,我们很喜欢使用这种for循环。

可是,当中隐含着一个重要的问题。

过多的编程经历可能使我们的思维产生了一些误解,在上面的for循环中,因为我们在以往过多的编程经历中更加关注for循环体中的内容,导致我们差点儿忽略了那个小i的存在,它扮演着作为计数器的一个“小角色”,我们忽略了它,殊不知它的“饭量”也是不小的哦~

#include<stdio.h>
#include<time.h>
int main()
{int temp;/********************************/temp=clock();for(int i=1;i<=100;i++);printf("%d\n",clock()-temp);/********************************/temp=clock();for(int i=1;i<=1000000000;i++);printf("%d\n",clock()-temp);/********************************/return 0;
}

程序执行结果是:

0

3000

这样看来,那个小i所耗掉的执行时间也是很可观的。一些编程新手觉得程序的执行时间是由循环次数决定的,这样说对于上面的那个程序貌似是对的,可是没有说到本质。略微懂编程的人都能知道,程序的执行时间是由程序的运算次数决定的,明显加减法要比乘除法快。

对于觉得执行时间由循环次数决定的想法是错误的,能够看以下的程序:

#include<stdio.h>
#include<time.h>
int main()
{int n,temp;/********************************/temp=clock();n=1;for(int i=1;i<=100000000;i++){n++,n--;n++,n--;n++,n--;n++,n--;n++,n--;n++,n--;n++,n--;n++,n--;n++,n--;n++,n--;}printf("%d\n",clock()-temp);/********************************/temp=clock();n=1;for(int i=1;i<=150000000;i++)n++,n--;printf("%d\n",clock()-temp);/********************************/return 0;
}

程序执行结果:

6291

901

前者的循环次数有一亿次,而后者的循环次数有一亿五千万次,可是后者更快,是由于前者的运算次数多。深入分析,前者的加减法运算次数大约是100000000+100000000*20=2100000000即21亿,比較次数(i<=100000000)是一亿次;而后者加减法运算次数是150000000+150000000*2=450000000即4亿5千万次,比較次数(i<=150000000)是一亿五千万次。前者比后者多了16亿5千万次的加减法,后者比前者多了5千万次的比較,依据数据大小的不同可能会有所差异。

不管怎样,我们一方面要认识到决定执行时间的因素究竟有哪些,还有一方面,我们更不能忽视掉for循环中小i的作用和消耗,尤其在小i嵌入一个二层循环中。

我之前做过一道算法题,我的程序要跑4s,而我同学给我优化的程序仅仅要跑不到1s,可是我始终找不到原因,由于推导的公式中累加的次数是一样的,仅仅只是我的循环是n*sqrt(n),而他的是n*lg(n)。我当时仅仅注重了公式中数据的累加,即我仅仅注重了循环体中的内容,忽视掉了小i也有做加法,尤其是套在一个数据量高达五十万的二层循环中,这时候,小i的影响就凸显出来了,由于在这个问题上,我和我的同学相差的地方仅仅有那个循环次数不一样了(公式中的累加肯定是一样的,不然得出的结果是不一样且不对的)。所以看来,有些时候须要特别的控制一下程序的循环次数,在算法一样的情况下,尤其对于多层循环的程序,降低循环次数可以出现意想不到的收益。

for循环中一个不容小觑的问题相关推荐

  1. js中不容小觑的var声明

    在学习vue相关课程中,有一次跟着老师敲代码,写出了如下代码: var Child = {template:`<div @click='handleClick'><slot>& ...

  2. Java循环中删除一个列表元素

    本文主要想讲述一下我对之前看到一篇文章的说法.假设跟你的想法有出入,欢迎留言.一起讨论. #3. 在循环中删除一个列表元素 考虑以下的代码.迭代过程中删除元素: ArrayList<String ...

  3. js中for循环调用回调函数,一直循环最后一个

    js的for循环中使用回调函数,获取到的值总是最后一个值?_MLAY-CSDN博客_js 循环回调函数

  4. python生成一个数组_在for循环中创建多个数组(Python)

    我目前遇到Numpy阵列的问题.如果在其他地方已经提出这个问题,我道歉,但我觉得我到处都是. 我最初的问题是我试图创建一个数组并用多组不同大小的站数据填充它.由于我无法使用大小不同的数据集填充相同的数 ...

  5. Excel VBA 循环读取一个目录下面多个文件的内容,放到另外一个文件中

    循环读取一个目录下面多个文件的内容,放到另外一个文件中 Public Sub getInputInfo()On Error GoTo errl'OUT対象ファイル開くDim wbOut As Work ...

  6. 建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内 如果需要在循环中引发异常,你需要特别注意,应为抛出异常是一个相当影响性能的过程。应该尽量在循环当中对异常发生的一

    建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内 如果需要在循环中引发异常,你需要特别注意,应为抛出异常是一个相当影响性能的过程.应该尽量在循环当中对异常发生的一些条 ...

  7. Spring事务For循环中的代码单独为一个事务,循环一次提交一次事务

    最近业务碰到for循环事务,也就是一个不成功,所有的操作全部回滚.需求做到每个for循环中的代码要单独回滚单独提交,不能影响外部代码环境,研究过之后,记录开发过程 @Transactional(rol ...

  8. php for循环逗号,关于php:从foreach循环中删除最后一个逗号

    我使用foreach循环从数据库中回显一些值,如果这有意义的话,我需要从最后一个循环中去掉最后一个逗号. 我的循环很简单,如下所示 foreach($results as $result){ echo ...

  9. 给v-for循环中的最后一个数组加不同的样式

    给v-for循环中的最后一个数组加不同的样式 <divv-for="(items, index) in goodList":key="index"ref= ...

最新文章

  1. 【渝粤题库】国家开放大学2021春2511幼儿园课程论题目
  2. 智能灯控制页面用HTML编写,智能家居系统中智能化灯光控制的设计实现
  3. 在python中一个子类只能有一个父类吗_在Python中,子类可以与父类在不同的文件中吗?...
  4. 微服务网关Zuul和Gateway的区别
  5. 上线两天用户 10W+,这款 AI 知识图谱小程序有多牛?
  6. SocketDataHandler ConcurrentAsyncQueue Server/Client
  7. windows服务应用--做个简单的定时调用EXE功能(笔记)
  8. loopback-detection(环路检测)
  9. pat 团体天梯 L3-011. 直捣黄龙
  10. 算法高级(45)-阿尔法狗到底有多厉害?
  11. joy数据向量化处理
  12. Chromium内核和Webkit的关系到底是什么?
  13. FinalShell显示文件夹
  14. 天干地支计算公式_天干地支怎么算?年柱的计算方法!
  15. 洛谷P5072 [YNOI2015]盼君勿忘 莫队+unordered_set+毒瘤卡常
  16. 第12章 GUI编程与Tkinter相关组件介绍
  17. Matlab的插值与拟合
  18. SPI协议主机verilog
  19. javaspring面试题及答案,你还看不明白?
  20. 从零开始搭建SpringBoot的Demo

热门文章

  1. Lighting System Design UVA 11400 (dp+思维)
  2. 值类型和引用类型---深究
  3. Spark Streaming原理简析
  4. 流程流转相关业务与流转的分离
  5. HEU 2036 Paths on a Grid
  6. 如何在ASP.NET服务器控件库中嵌入JavaScript脚本文件 [适用于.NET 2.0]
  7. C#操作快捷方式(获取快捷方式属性、创建快捷方式)
  8. java的几_Java的几种时间
  9. css中改变边距会影响原大小,CSS:更改父容器中子项的边距会改变子项的宽度吗?...
  10. linux7有相当于wget的,centos7安装mwget下载资源,提升下载速度