《数据结构与算法分析-C语言描述》习题2.6

《数据结构与算法分析-C语言描述》([url=http://users.cis.fiu.edu/~weiss/#dsaac2e]Data Structures and Algorithm Analysis in C[/url])习题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下测量函数段的执行时间可以使用其他的方法,例如:[url]http://stackoverflow.com/questions/2215744/c-programming-how-can-i-get-execution-time-of-a-program-in-milliseconds[/url]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 6.0 正式版终于发布了!除了多线程还有什么新功能?

这是我的第 56 篇原创文章Redis 6.0.1 于 2020 年 5 月 2 日正式发布了&#xff0c;如 Redis 作者 antirez 所说&#xff0c;这是迄今为止最“企业”化的版本&#xff0c;也是有史以来改动最大的一个 Redis 版本&#xff0c;同时也是参与开发人数最多的一个版本。所以在使用此版…

在Java中从字符串转换为双精度

Given a string value and we have to convert it into a double. 给定一个字符串值&#xff0c;我们必须将其转换为双精度型。 Java conversion from String to Double Java从String转换为Double To convert a String to Double, we can use the following methods of Doubl…

如何优雅地「蜗居」?

如果我们把「蜗居」理解为小户型、小空间居住&#xff0c;包括合租、大开间等&#xff0c;如何才能让「蜗居」丝毫不尴尬&#xff0c;所谓「优雅」&#xff0c;就是排除客观限制&#xff0c;最大限度的提升居住品质。王珦&#xff0c;室内设计师&#xff0c;文字编辑 蜗居要看“…

计算程序的执行时间

在windows下计算一段程序的执行时间&#xff0c;有以下方法&#xff1a; &#xff08;1&#xff09;&#xff1a;使用[urlhttp://msdn.microsoft.com/en-us/library/4e2ess30%28VS.71%29.aspx]clock()[/url]函数&#xff08;需包含头文件time.h) 我的c程序代码如下&#xff1a;…

一文带你看完ZooKeeper!

作者 | FrancisQ来源 | JavaGuide“文章很长&#xff0c;先赞后看&#xff0c;养成习惯。❤️ ???? ???? ???? ???? ????”什么是ZooKeeperZooKeeper 由 Yahoo 开发&#xff0c;后来捐赠给了 Apache &#xff0c;现已成为 Apache 顶级项目。ZooKeeper 是一…

c# uri.host_C#| Uri.HostNameType属性与示例

c# uri.hostUri.HostNameType属性 (Uri.HostNameType Property) Uri.HostNameType Property is the instance property of Uri class which used to get the type of hostname specified in the given URI. This property returns a string value. This property may generate …

Struts里面的配置笔记

xml配置 package 用来区分重名 namespace 必须/开头 里面写的内容 前台反问的时候就加上 如果不写的话 只要你在url里面敲action都可以访问的到 result 默认的是SUCCESS 拷贝一个工程的时候要注意修改web里面的 context-root 转载于:https://www.cnblogs.com/yuzhengdong/p/394…

2023年底和2024年节假日及补班日期

holiday:#节假日- 2023-12-30- 2023-12-31- 2024-01-01- 2024-02-10- 2024-02-11- 2024-02-12- 2024-02-13- 2024-02-14- 2024-02-15- 2024-02-16- 2024-02-17- 2024-04-04- 2024-04-05- 2024-04-06- 2024-05-01- 2024-05-02- 2024-05-03- 2024-05-04- 2024-05-05- 2024-06-10-…

一些书评网站

http://c2.com/cgi/wiki?CategoryBook 计算机方面的书籍推荐 http://bookshelved.org/cgi-bin/wiki.pl?backBookOnTheBookshelf 各种书籍推荐 http://accu.org/index.php?modulebookreviews&funcsearch accu书评 http://www.softpanorama.org/Bookshelf/classic.s…

HashMap 的 7 种遍历方式与性能分析!「修正篇」

这是我的第 57 篇原创文章首先&#xff0c;给大家说声抱歉~事情经过是这样子的&#xff0c;五一节前我发布了一篇文章《HashMap 的 7 种遍历方式与性能分析&#xff01;》&#xff0c;但是好心的网友却发现了一个问题&#xff0c;他说 “测试时使用了 sout 打印信息会导致测试的…

c# uri.host_C#| Uri.EscapeUriString()方法与示例

c# uri.hostUri.EscapeUriString()方法 (Uri.EscapeUriString() Method) Uri.EscapeUriString() method is a static method that is used to convert specified Uri string in escaped representation. Uri.EscapeUriString()方法是一个静态方法&#xff0c;用于转换转义表示形…

今天是 OSChina 上线 6 周年!

2019独角兽企业重金招聘Python工程师标准>>> 没什么想说的&#xff0c;除了感谢和继续努力外&#xff0c;感谢所有的 oscers 们、感谢 OSC 曾经和现在的小伙伴、感谢我们的合作伙伴。 今年还有4个月&#xff0c;主要工作安排包括&#xff1a; TeamOSC 上线 PaaSO…

coroutine资源索引

coroutine (通常被译为“协作程序”或"共行程序“&#xff09;是程序设计中一个非常重要的概念&#xff0c;通常可用于多任务协作处理、迭代器和管道中。它最早出现于”Design of a Separable . Transition -Diagram Compiler “这篇论文中,taocp (the art of computer p…

操作系统大内核和微内核_操作系统中的内核I / O子系统

操作系统大内核和微内核内核输入/输出子系统 (Kernel Input / Output subsystem) Input and output (I/O) devices permit us to communicate with the computer system. I/O is the transfer of data between RAM and various I/O peripherals. By using Input devices such a…

StackOverflow 上面最流行的 7 个 Java 问题!

StackOverflow发展到目前&#xff0c;已经成为了全球开发者的金矿。它能够帮助我们找到在各个领域遇到的问题的最有用的解决方案&#xff0c;同时我们也会从中学习到很多新的东西。这篇文章是在我们审阅了StackOverflow上最流行的Java问题以及答案后从中挑出来的。即使你是一个…

UbuntuKylin安装SUN JDK1.7

1.下载jdk1.7.0_67并且解压&#xff0c;放知道/usr/local/lib/jvm目录下tar zxvf jdk1.7.0_67.tar.gzsudo mv jdk1.7.0_67 /usr/local/lib/jvm2.编辑~/.bashrc文件&#xff0c;添加如下内容。JAVA_HOME后的内容为你自定义的JDK存放目录export JAVA_HOME/usr/local/lib/jvm/jdk1…

程序设计竞赛资源索引

如果想提高编程能力&#xff0c;最重要的就是多练多学&#xff0c;现在网络上提供了大量的习题库&#xff0c;可以很方便的练习编程。 ACM/ICPC题库(支持c,c,java,pascal)&#xff1a; 台州学院acm :有不少习题使用中文描述&#xff0c;分类清晰&#xff0c;适合初学者。题目…

c++ stl stack_C ++ STL中的stack :: push()函数

c stl stackPrototype: 原型&#xff1a; stackst; //declarationst.push(T item);Parameter: 参数&#xff1a; T item; //T is the data typeReturn type: void 返回类型&#xff1a; void Header file to be included: 包含的头文件&#xff1a; #include <iostream&…

if快还是switch快?解密switch背后的秘密

这是我的第 57 篇原创文章条件判断语句是程序的重要组成部分&#xff0c;也是系统业务逻辑的控制手段。重要程度和使用频率更是首屈一指&#xff0c;那我们要如何选择 if 还是 switch 呢&#xff1f;他们的性能差别有多大&#xff1f;switch 性能背后的秘密是什么&#xff1f;接…

MySQL replace into (insert into 的增强版)

在使用SQL语句进行数据表插入insert操作时&#xff0c;如果表中定义了主键&#xff0c;插入具有相同主键的记录会报错&#xff1a; Error Code: 1062. Duplicate entry XXXXX for key PRIMARY(主键冲突) 这样我们只好检查主键是不是存在&#xff0c;若存在则更新&#xff0c;若…