《数据结构与算法分析-C语言描述》(
Data Structures and Algorithm Analysis in C)习题2.6
该题要求计算几个循环的复杂度,并用程序计算出程序的执行时间。我在linux下的c程序如下:
/* exercise 2.6 in <data structures and algorithm in c>*/
#include <stdio.h>
#include <sys/time.h>
#include <math.h>
#define MAXINPUT 260
#define STEP (MAXINPUT/20)
#define ZOOMIN 100000000
int Fun1(int n)
{
int sum = 0;
int i;
for(i = 0; i < n; i++)
sum++;
return sum;
}
int Fun2(int n)
{
int sum = 0;
int i,j;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
sum++;
return sum;
}
int Fun3(int n)
{
int sum = 0;
int i,j;
for(i = 0; i < n; i++)
for(j = 0; j < n*n; j++)
sum++;
return sum;
}
int Fun4(int n)
{
int sum = 0;
int i,j;
for(i = 0; i < n; i++)
for(j = 0; j < i; j++)
sum++;
return sum;
}
int Fun5(int n)
{
int sum = 0;
int i,j,k;
for(i = 0; i < n; i++)
for(j = 0; j < i*i; j++)
for(k = 0; k < j; k++)
sum++;
return sum;
}
int Fun6(int n)
{
int sum = 0;
int i,j,k;
for(i = 0; i < n; i++)
for(j = 0; j < i*i; j++)
if(j%i == 0)
for(k = 0; k < j; k++)
sum++;
return sum;
}
int GetSpendTime(int (* f)(int ), int n)
{
struct timeval StartTimer,EndTimer;
double SpendTime;
double NPow3,NPow4,NPow5,NPow4LogN;
NPow3 = pow(n,3);
NPow4 = pow(n,4);
NPow5 = pow(n,5);
NPow4LogN = pow(n,4)*log(n);
gettimeofday(&StartTimer,NULL);
(*f)(n);
gettimeofday(&EndTimer,NULL);
SpendTime = EndTimer.tv_sec - StartTimer.tv_sec +(EndTimer.tv_usec - StartTimer.tv_usec)/1000000.0;
printf("N=%d,SpendTime=%.6f,T/N3=%.6f,T/N4=%.6f,T/N5=%.6f,T/N4logN=%.6f\n",
n,SpendTime,SpendTime*(ZOOMIN/NPow3),SpendTime*(ZOOMIN/NPow4),
SpendTime*(ZOOMIN/NPow5),SpendTime*(ZOOMIN/NPow4LogN));
return 0;
}
int main(void)
{
int i;
for(i = MAXINPUT/4; i < MAXINPUT; i+=STEP)
GetSpendTime(Fun5,i);
/* GetSpendTime(Fun5,20);*/
return 0;
}
输出结果为:
N=65,SpendTime=0.497344,T/N3=181.099317,T/N4=2.786143,T/N5=0.042864,T/N4logN=0.667438
N=78,SpendTime=1.194641,T/N3=251.740800,T/N4=3.227446,T/N5=0.041378,T/N4logN=0.740799
N=91,SpendTime=2.600523,T/N3=345.093296,T/N4=3.792234,T/N5=0.041673,T/N4logN=0.840690
N=104,SpendTime=5.029540,T/N3=447.124275,T/N4=4.299272,T/N5=0.041339,T/N4logN=0.925691
N=117,SpendTime=9.153871,T/N3=571.540753,T/N4=4.884964,T/N5=0.041752,T/N4logN=1.025784
N=130,SpendTime=15.069480,T/N3=685.911698,T/N4=5.276244,T/N5=0.040586,T/N4logN=1.083966
N=143,SpendTime=24.084789,T/N3=823.634886,T/N4=5.759685,T/N5=0.040278,T/N4logN=1.160561
N=156,SpendTime=37.684631,T/N3=992.637029,T/N4=6.363058,T/N5=0.040789,T/N4logN=1.260047
N=169,SpendTime=55.917730,T/N3=1158.482343,T/N4=6.854925,T/N5=0.040562,T/N4logN=1.336269
N=182,SpendTime=82.133201,T/N3=1362.399844,T/N4=7.485713,T/N5=0.041130,T/N4logN=1.438452
N=195,SpendTime=115.332322,T/N3=1555.418291,T/N4=7.976504,T/N5=0.040905,T/N4logN=1.512707
N=208,SpendTime=159.712267,T/N3=1774.795297,T/N4=8.532670,T/N5=0.041022,T/N4logN=1.598615
N=221,SpendTime=217.001617,T/N3=2010.417005,T/N4=9.096910,T/N5=0.041162,T/N4logN=1.685186
N=234,SpendTime=337.556033,T/N3=2634.500602,T/N4=11.258550,T/N5=0.048113,T/N4logN=2.063774
N=247,SpendTime=408.777333,T/N3=2712.663639,T/N4=10.982444,T/N5=0.044463,T/N4logN=1.993405
此程序中计算第五个函数func5的运行时间,并将此时间分别除以(N^3),(N^4),(N^5)和(N^4*long(N))。因为N^5的值很大,而执行时间通常比较小,我又使用了一个放大系数ZOOMIN使得除法运算的结果不至于误差太大。还需要注意的是,如果换成其他的函数,可以根据需要调节ZOOMIN和MAXINPUT的值,使得程序运行结果能更准确的反映该函数的算法执行复杂度。
从输出结果来看,T/N5的值趋向于一个比较固定的数,所以func5应该是O(N^5)左右,这个算法可以用来验证自己计算的算法复杂度是否正确。
可惜的是,上面的算法只能用于unix/linux下,windows下测量函数段的执行时间可以使用其他的方法,例如:
http://stackoverflow.com/questions/2215744/c-programming-how-can-i-get-execution-time-of-a-program-in-milliseconds
分享到:
相关推荐
2.6 赋值运算符与赋值表达式 2.6.1 赋值运算符 2.6.2 赋值过程中的类型转换 2.6.3 复合的赋值运算符 2.6.4 赋值表达式 2.7 逗号运算符与逗号表达式 习题 第2篇 面向过程的程序设计 第3章 程序设计初步 3.1 面向...
2.6 赋值运算符与赋值表达式 2.6.1 赋值运算符 2.6.2 赋值过程中的类型转换 2.6.3 复合的赋值运算符 2.6.4 赋值表达式 2.7 逗号运算符与逗号表达式 习题 第2篇 面向过程的程序设计 第3章 程序设计初步 3.1 面向...
本题主要涉及了数据结构中的抽象数据类型(ADT)以及一些基本的算法操作,包括链表的操作、排序算法以及时间复杂度分析。 首先,题目给出了复数和有理数两种抽象数据类型的定义。在C语言中,ADT可以通过结构体来...
1.3 算法形式规范 1.4 数据抽象 1.5 性能分析 1.6 性能度量 1.7 参考文献和选读材料 第2章 数组和结构 2.1 数组 2.2 数组的动态存储分配 2.3 结构体和联合体 2.4 多项式 2.5 稀松矩阵 2.6 多维数组的表示...
通过分析儿子做题的过程,可以学习到如何在C语言中使用递归函数,并理解递归算法的效率与局限性。 #### 1.4 乐队人数 该问题探讨了如何计算满足特定条件下的乐队成员数量组合,引入了组合数学的概念。在C语言中,...
这些技能对于理解和设计复杂的数据结构算法至关重要,如排序、查找以及图和树的处理等。同时,C语言作为底层系统编程的常用语言,对理解数据结构的底层实现非常有帮助。因此,这个压缩包是学习数据结构的理想资源,...
“新概念C语言”突破了以往任何一种语言教材的旧的模式,将教学内容分为入门篇和提高篇两个篇章。在入门篇中只引进程序设计必要的语法现象,达到快速入门。激发兴趣的目的。在入门篇和提高篇之间插一个强化上机实验...
涉及二进制位运算,如位移、按位与或异或等操作,是C语言中常见的算法练习,能够加深对二进制理解和位运算符的掌握。 #### 1.8 岁数 可能探讨年龄计算、生日推算等问题,需要理解日期的计算规则,并能在程序中正确...
《C语言经典算法》一书,由网络上热心的编程爱好者整理而成,旨在汇集并解析C语言中的经典算法,为学习者提供一个深入理解与实践的平台。此书按照算法类型分为三大章节:数值处理、图形输出和数据处理,每个章节下的...
- **练习答案**:提供书中练习题的答案。 - **在线资源**:推荐一些在线学习资源。 - **Python 3.1新特性**:介绍Python 3.1版本中新增的功能。 - **词汇表**:提供Python编程相关的术语解释。 通过上述章节的详细...
系统地讲述c语言的基础知识、基本语法以及编程方法,并且结合c阐述面向对象的程序设计思想,使读者在掌握c语言语法知识的同时,能够解决现实生活中较简单的问题,并用计算机语言进行描述。本书每一章中都用大量实用...
2.6 类型转换和类型强制转换 64 2.6.1 赋值语句中的类型转换 65 2.6.2 显式类型转换 65 2.6.3 老式的类型强制转换 66 2.7 AUTO关键字 66 2.8 查看类型 67 2.9 按位运算符 67 2.9.1 按位AND运算符 68 2.9.2 ...