概述
估算运行时间是一个面试的常见问题,我今天做了一个小实验,用快速排序算法排序,测试运行时间。
排序函数用的是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("%dn",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 usn", LENGTH, timeuse);
printf("%d %d n", LENGTH, timeuse);
}
}
最后
以上就是威武电脑为你收集整理的面试常见问题——估算运行时间的全部内容,希望文章能够帮你解决面试常见问题——估算运行时间所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复