首页 > 代码库 > 关于算法运行时间以及“管道”为什么引入

关于算法运行时间以及“管道”为什么引入

 

1. 关于算法运行时间以及“管道”为什么引入。

 

我以前毕设比较不同译码算法的时候,直接用一个clock()来比较不同算法运行速率。现在想起来,这是及其错误了!

《算法竞赛入门经典》P64

一个程序中计时函数clock()的使用。该函数返回程序目前为止运行的时间。这样,在程序结束之前调用此函数,便可获得整个程序的运行时间。这个时间除以常数CLOCKS_PER_SEC之后得到的值以“秒”为单位。


提示2-17:可以使用time.h和clock()函数获得程序运行时间。常数CLOCKS_PER_SEC和操作系统相关,请不要直接使用clock()的返回值,而应总是除以CLOCKS_PER_SEC。


输入“20”,按Enter键后,系统瞬间输出了答案820313。但是,输出的Time used居然不是0!其原因在于,键盘输入的时间也被计算在内——这的确是程序启动之后才进行的。为了避免输入数据的时间影响测试结果,可使用一种称为“管道”的小技巧:在Windows命令行下执行echo 20|abc,操作系统会自动把20输入,其中abc是程序名 。如果不知道如何操作命令行,请参考附录A。笔者建议每个读者都熟悉命令行操作,包括Windows和Linux。



2. 输入输出框架

在做CCF的模拟题的题一,我常用的一个方法是

int n;
cin>>n;
int A[n];

int i;
for(i=0;i<n;i++){
    cin>>A[i];
}

其实这样往往遇到一个问题,如果输入没有先输入n这一个步骤,而是任意输入的数字流,就不知所措了。

在《算法竞赛入门指导》P66,有如下

while(scanf("%d", &x) == 1)
{
s += x;
if(x < min) min = x;
if(x > max) max = x;
n++;
}
printf("%d %d %.3f\n", min, max, (double)s/n);

可以用while(。。。!=0)之类的判断吧。

 

对于C语言

还记得scanf的输入格式吗?空格、TAB和回车符都是无关紧要的,所以按Enter键并不意味着输入的结束。那如何才能告诉程序输入结束了呢?

提示2-19:在Windows下,输入完毕后先按Enter键,再按Ctrl+Z键,最后再按Enter键,即可结束输入。在Linux下,输入完毕后按Ctrl+D键即可结束输入。

 

对于C++

cin会在空格位置就停止的,getline才可以读到回车,网上看到的,以后注意。

 

关于算法运行时间以及“管道”为什么引入