数据结构之数据指标对比(Performance Measurement)

前言

在最近整理大学前两年学的内容时,突然发现了这个初级数据结构程序,主要是对各种数据结构的性能加以对比。当时没觉得容易,现在简要的看了一下,感觉确实比较基础。现在优化部分代码后放在这里,或许可以给各位带了来一些帮助。

题目要求

Performance Measurement (POW)

在这里插入图片描述
在这里插入图片描述
Note: If a function runs so quickly that it takes less than a tick to finish, we may repeat the function calls for K times to obtain a total run time, and then divide the total time by K to obtain a more accurate duration for a single run of the function. The repetition factor must be large enough so that the number of elapsed ticks is at least 10 if we want an accuracy of at least 10%.
The test results must be listed in the following table:
在这里插入图片描述
The performances of the three functions must be plotted in the same N–run_time coordinate system for illustration.

代码部分

#include <stdio.h>;
#include <time.h>;

#define k 300000                                          //设定 k 为重复运行的次数 

double Algorithm_1(double x,int n);						  //Algorithm 1的函数 
double Algorithm_2_recursive(double x,int n);             //recursive version of Algorithm 2的函数 
double Algorithm_2_iterative(double x,int n);             //iterative version of Algorithm 2的函数 

int main()
{   
	double duration,x,ans_1,ans_2,ans_3;                  //ans_1,ans_2,ans_3分别为三个函数计算出来的结果 , x 为底数 
	clock_t  start,stop;
	int n;                                                //n 为指数 

	printf ("请输入X和N\n");                              
	scanf("%lf%d",&x,&n);                                 //输入底数 x 和指数 n  
	
    start=clock();                                        //开始计时 
    
	for(int i=0;i<k;i++)                                  //重复运行函数 k 次 (Algorithm 1) 
	{
	ans_1= Algorithm_1(x,n);                   
	}
	
	stop=clock();                                         //结束计时 

    duration=((double)(stop-start))/CLK_TCK;              //重复 k 次所花费的的总时间 
	
	printf("Algorithm 1:\n计算结果为%lf \n",ans_1);       //输出结果 
	printf("耗时为%lfs \n",duration);                   //输出总运行时间 (Algorithm 1) 

	start=clock();                                        //开始计时 
	
	for(int i=0;i<k;i++)                                  //重复运行函数 k 次 (recursive version of Algorithm 2)
	{
	ans_2=Algorithm_2_recursive(x,n);           
	}
	
	stop=clock();                                         //停止计时 

    duration=((double)(stop-start))/CLK_TCK;
	
	printf("recursive version of Algorithm 2:\n计算结果为%lf \n",ans_2);
	printf("耗时为%lfs \n",duration);                   //输出总运行时间 (recursive version of Algorithm 2) 
	
	start=clock();                                       //开始计时 
    
	for(int i=0;i<k;i++)                                  //重复运行函数 k 次 (iterative version of Algorithm 2)
	{
	ans_3=Algorithm_2_iterative(x,n);
	}
	
	stop=clock();                                          //停止计时 

    duration=((double)(stop-start))/CLK_TCK;
	
	printf("iterative version of Algorithm 2:\n计算结果为%lf \n",ans_3);
	printf("耗时为%lfs \n",duration);                    //输出总运行时间 (iterative version of Algorithm 2)
	
	return 0;
}


double Algorithm_1(double x,int n)                         //算法一,应用 n-1 次的乘法 
{
    double m=1;

	for (int i=0;i<n;i++)                                  //for循环来重复 n-1 次乘法 

		m=m*x;			 


    return m;
} 


double Algorithm_2_recursive(double x,int n)               //递归的算法二 
{
	
        if (n==0) return 1;
        if (n==1) return x;
		if (n % 2 == 0)                                    //如果n是偶数,则返回 Algorithm_2_recursive(x*x,n/2);
			
			return Algorithm_2_recursive(x*x,n/2);

		else                                               //如果n是奇数,则返回 Algorithm_2_recursive(x*x,n/2)* x;
			
			return Algorithm_2_recursive(x*x,n/2)* x;
	
}


double Algorithm_2_iterative(double x,int n)                //迭代的算法二 
{
		double m=1;                                         
		int sign[40];                                       //定义一个数组  
        for(int i=0;i<40;i++){                              //初始化为 0 
            sign[i]=0;
        }
        int j=0;
        while(n>0)
		{                                                   //sign 数组记录指数 n 每次除以 2 后的余数 
            sign[j++]=n%2;
            n/=2;
        }
        --j;
        while(j>=0)
		{
            if(sign[j])
			{                                               //如果某次余数为 1 ,则上来时需再乘以一个 x 
                m=m*m*x;
            }else m=m*m;                                    //如果某次余数为 0 ,则不需要乘以 x 
        --j;
        }
        return m;                                           //返回最后的结果 
}

后记

记得这应该是Data Structure课程的第一个大程。相对最为简单,之后我将陆续整理DS课程和ADS课程的其他大程一并放上来,以望共勉。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值