面试常见问题——估算运行时间


估算运行时间是一个面试的常见问题,我今天做了一个小实验,用快速排序算法排序,测试运行时间。


排序函数用的是C语言库的qsort,排序的数据类型为int,详细代码见后面的附录。


实验环境:linux64位操作系统,CPU:Intel 酷睿双核,T5750,主频2GHz。T5750是早期的CPU(笔记本在08年购买),虽然主频还过得去,但是根据网上的测试,i7的总体表现可以超过它10倍。

实验结果:

size of date 10 , time: 11 us
size of date 100 , time: 27 us
size of date 1000 , time: 497 us
size of date 10000 , time: 4180 us
size of date 100000 , time: 27330 us
size of date 1000000 , time: 316430 us
size of date 10000000 , time: 3662165 us

1 秒 = 1 000 000 us 

尝试给1亿个int数据排序,但是速度非常慢,所以最大的数据只有一千万,一千万个int只有40M的数据!

程序运行了多次,时间稳定,所以使用单次实验结果作为最终实验结果是大致可靠的(我只做数量级上的估算)。

大小为n的数据,用快速排序,时间复杂度为n*log(n),时间的单位为微秒,2GHz的CPU一个微秒有2000个周期(这个程序显然只在一个核上运行)。

最后计算:time * 2000 /  (n * log (n)),当n比较大时,基本稳定在50左右。

可以粗略得出下面的结论,给定大小为n的数据排序,需要的“比较”次数为n * log (n),每次“比较”消耗50个CPU主频周期,这个估算只在数量级上成立。



附录:实验用的C代码

#include<stdio.h>
#include "stdlib.h"
#include <sys/time.h>


inline int cmp (int * a, int * b) 
{
return (*a - *b );
}


int main(){
int *p;
int LENGTH = 10;
struct timeval start, end;
int j;
for (j=0; j < 7; j++, LENGTH *= 10) {
p = (int *) malloc ( LENGTH * sizeof (int) );
int i;
for (i = 0; i < LENGTH; i++) {
p[i] = rand();
//printf("%d\n",p[i]);
}


gettimeofday( &start, NULL );


qsort(p, LENGTH, sizeof(int), cmp);


gettimeofday( &end, NULL );


int timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec;

free(p);

//printf("size of date %d , time: %d us\n", LENGTH, timeuse);
printf("%d   %d \n", LENGTH, timeuse);
}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值