for循环中一个不容小觑的问题
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循环中一个不容小觑的问题的更多相关文章
- js中不容小觑的var声明
在学习vue相关课程中,有一次跟着老师敲代码,写出了如下代码: var Child = { template:`<div @click='handleClick'><slot> ...
- .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
林德熙 小伙伴希望保存一个文件,并且希望如果出错了也要不断地重试.然而我认为如果一直错误则应该对外抛出异常让调用者知道为什么会一直错误. 这似乎是一个矛盾的要求.然而最终我想到了一个办法:让重试一直进 ...
- PHP 中for循环的一个小小改进
注意 : 1, $size这个值可以放在for循环中的第一个 ';' 前声明, 因为这个声明只会执行一次; 2, 第二个 ';' 中的内容, 会重复运行, 所以$i < $size 这个判断会每 ...
- Java循环中删除一个列表元素
本文主要想讲述一下我对之前看到一篇文章的说法.假设跟你的想法有出入,欢迎留言.一起讨论. #3. 在循环中删除一个列表元素 考虑以下的代码.迭代过程中删除元素: ArrayList<String ...
- python3中 for line1 in f1.readlines():,for line1 in f1:,循环读取一个文件夹
循环读取一个文件: fr.seek(0) fr.seek(0, 0) 概述 seek() 方法用于移动文件读取指针到指定位置. 语法 seek() 方法语法如下: fileObject.seek(of ...
- c代码中while循环的一个死机问题引发的思考
前记 c语言已经是一门经常吃饭的本领,本来是要有种看一眼,就知道哪儿出问题了才行,没想到,遇到实际问题的时候,才知道自己的修为不到家.还没有达到那种炉火纯青的境界.看来,不是这个世界没有机会,是自 ...
- For each循环中使用remove方法。
List<String> list =new ArrayList<String>(); list.add("boss"); list.add("g ...
- C#Random函数在循环中每次获取一样的值
首先需要了解一点Random函数的随机生成是和当前时间有关系,如果在短时间生成随机数,就会导致随机数生成出来是相同的. 不过我们可以在每次随机时指定一个Seed种子值,这样在循环里就可以每次获取不一样 ...
- js for 循环中的 变量问题。
今日处理项目中的一个循环,本来就是一个小小的for循环,后来发现该段程序出现了问题,仔细检查代码没有发现其中的错误.无奈只好叫来了老大帮忙.通过在模版中断点调试(该方式只能自己写debugger断点) ...
随机推荐
- cell中button怎么得到对应cell的indexpath 以及关于UITableViewCellContentView的问题
============================================================ 博文原创,转载请声明出处 电子咖啡-专注于移动互联网 ============ ...
- DM8168硬件平台
DM8168硬件平台 作者:Marvin_wu TMS320DM8168是一款多核SoC,它集成了包含ARM Cortex A8.DSP C674X+.M3 VIDEO.M3 VPSS等处理器.DS ...
- Swift - 生成各种控件的工厂类(包含标签,按钮,输入框等)
在iOS开发中,页面里有时会大量的用到一些控件,如果要一个个单独创建再设置样式的话就显得很麻烦.我们可以创建一个生成各种控件的工厂类,这样在需要的时候调用下就可以了. 下面以一个自定义的工厂类为例,其 ...
- 暂停和屏蔽右键网页中的Flash
如何暂停网页中的Flash?原理很简单,就是屏蔽Flash的消息即可.屏蔽右键也可以通过此方法 直接贴代码吧,加了注释,很容易就能懂了 新建工程,加一个WebBrowser,再加两个按钮.Flash ...
- 推荐一款功能强大的js 在线编辑器
http://jszi.cn/public/oherub/11/edit
- 阅读代码分析工具Understand 2.0试用
Understand 2.0是一款源码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实能够大大提高代码阅读效率. 因为Understand功能十分强大,本文不可能详尽地介绍它的全部功能,所 ...
- Delphi自写组件:可设置颜色的按钮(改成BS_OWNERDRAW风格,然后CN_DRAWITEM)
unit ColorButton; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, StdCtrls; ...
- jquery怎么在点击li标签之后添加一个在class,点击下一个li时删除上一个class?
思路:点击当前li元素后是用removeClass()删除所有兄弟元素(使用siblings()获取)的class样式,然后使用addClass()为当前li添加class. 具体演示如下: 1.HT ...
- Mojo Mysql utf-8字符集 需要{mysql_enable_utf8 => 1}
get '/api/log_mon/get_log' => sub{ my $c = shift; my $env = $c->param('env'); my $host = $c-&g ...
- HDU 4284 Travel
据说是TSP经典问题...可以用状态压缩做.但是看到数据量,就厚着脸皮上搜索了...先floyd预处理每对点间的最小消费,然后只考虑要去的城市就可以了,这样的话城市数最多16个...当时就暴搜了... ...