小鲤只是一条想要好运的笨鲤鱼o(* ̄▽ ̄*)ブ
你的程序运行了多久呢?怎么看呢?别着急,小鲤为你提供了两个办法 o(^▽^)o
1.时钟打点
#include"stdio.h"
#include"time.h"
clock_t start,stop; //(1)
void Myfunction(void){
//(2)
}
double duration;
int main()
{
...... //(3)
start =clock();
Myfunction();
stop =clock();
duration =((double)stop-start)/CLK_TCK;
...... //(3)
printf("%.2f",duration);
return 0;
}
(1)clock_t是clock()函数返回的变量名;clock()函数在time.h中
(2)这里是你想要测试运行的程序
(3)一些不在测试范围的准备工作或者处理放在这里:
我们来测试下:
item:给定多项式在定点的值:
好了,我们给出两个函数:
double f1(int n,double a[],double x) //(1)
{
double p=a[n];
for(int i=n;i>0;i--)
p=a[i-1]+x*p;
return p;
}
double f2(int n,double a[],double x) //(2)
{
double p=a[0];
for(int i=1;i<n;i++)
p+=(a[i]*pow(x,i));
return p;
}
(1)秦九韶公式
(2)一般的多项式加和
这里不做更多的赘述了。但是运行后(请你自己找一个多项式带入)时间都是0.00e
但是这两个函数的时间可不是一样的呀!
想到物理中的累加法了吗? (●´▽`●)
将被测函数重复运行多次,求平均值
于是,我们有了:
#define MAXK 1e7 //(1)
......
for(i=0;i<MAXk;i++){ //(2)
myfunction();
}
......
这里仅给出循环部分。
(1)宏定义,defne;1e7是科学计数法,等价于十的七次方;
(2)循环MAXK-1次;
有人会问了,小鲤,每次都要这样吗?如果我的数据规模是千万级,甚至是亿万级呢?我的代码再来三个嵌套for循环,我怎么会等到我的电脑给出结果啊
所以,我们更经常使用的是第二种方法,来看程序运行时间
(至于为啥有第一种,他只是你闲的无聊的耍酷工具而已ヽ(○´∀`)ノ)
2,时间复杂度
这块内容其实东西不少,但是小鲤怎么忍心让读者大大看什么大O啊,小O啊什么奇怪的符号啊(才不是小鲤懒呢)
总结有这么几点,你会了就🆗了
1.计算你的程序时间复杂度,数据规模都是n(这里的n可以看作一个无穷级数,所以时间复杂度可以看作渐进的)
2,我们最常用的是大o,即
我们在推导大O阶时,有这样的操作
①不计算常数余项,如+5,-3这样的小项
②抓大放小,如我们只看
项,此外我们不看系数,系数常被忽略;
③对于logn,我们不关心它的底数;
其他你还要注意的:
学会了吗?
如果我的文章对你有帮助,不要吝惜你的点赞,小鲤希望得到你的支持ლ(´ڡ`ლ)
求三连和关注!!!
部分内容来自mooc数据结构(浙大)和算法图解