初识算法

1、利用clock()函数计算程序运行时间

clock():捕捉从程序开始运行到clock() 被调用时所消耗的时间。这个时间单位是clock tick,即“时钟打点”。 常数CLK_TCK:机器时钟每秒所走的时钟打点数

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

#define MAXK 1e7        /*被测函数最大重复调用次数*/
clock_t start, stop;
/*clock_t 是clock()函数返回的变量类型*/
double duration;
/*记录被测函数运行时间,以秒为单位*/

int main()
{
    /*不在测试范围内的准备工作写在clock()调用之前*/
    start =clock();            /*开始计时 */
    for(i=0;i<MAXK;i++)        /*被测函数循环n次*/ 
    MyFunction();            /*把被测函数加这里 */
    
    stop =clock();            /*停止计时*/
    duration = ((double)(stop - start))/CLK_TCK/MAXK; 
    /*计算运行时间*/
    /*其他不在测试范围的处理写在后面,例如输出duration的值*/ 
    return 0;
}

2、应用实例---多项式求解

//多项式求解--试用程序时间函数 
#include <stdio.h>
#include <math.h>
#include <time.h> 
#define MAXN 10 /*多项式最大项数,即多项式阶乘数+1*/
#define MAXK 1e7
clock_t start,stop;
double duration;
double f1(int n,double a[],double x);
double f2(int n,double a[],double x);

int main()
{
    int i;
    double a[MAXN];        /*储存多项式的系数*/
    for(i=0;i<MAXN;i++)        a[i]=double(i);
    /*测试f1*/
    start = clock();
    for(i=0;i<MAXK;i++)
        f1(MAXN-1,a,1.1);
    stop =clock();
    duration =((double)(stop-start))/CLK_TCK/MAXK;
    printf("ticks1= %f\n",(double)(stop-start));
    printf("duration1=%6.2e\n",duration);
    /*测试f2*/
    start = clock();
    for(i=0;i<MAXK;i++)
        f2(MAXN-1,a,1.1);
    stop =clock();
    duration =((double)(stop-start))/CLK_TCK/MAXK;
    printf("ticks2= %f\n",(double)(stop-start));
    printf("duration2=%6.2e\n",duration);
    return 0;
}
double f1(int n,double a[],double x)
{
    int i;
    double p=a[0];
    for(i=1;i<=n;i++)//(n*n+n)/2次乘法 
    {
        p+=a[i]*pow(n,i);
    }
    return p;
}

double f2(int n,double a[],double x)
{
    int i;
    double p=a[n];
    for(i=n;i>0;i--)//计算加减法的效率比乘除法快很多---n次乘法 
    {
        p=a[i-1]+x*p;
    }
    return p;
}

3、应用实例---最大子列

四种算法对比理解时间复杂度

 

/*算法1------O(N^3)*/
int MaxSubseqSum1(int A[] ,int N)
{
    int ThisSum,MaxSum = 0;
    int i,j,k;
    for(i=0;i<N;i++)                //i是子列左端位置 
    {
        for(j=i;j<N;j++)            //j是子列右端位置 
        {
            ThisSum=0;                //ThisSum是A[i]-A[j]的子列和 
            for(k=i;k<=j;k++)
            {
                ThisSum +=A[k];
                if(ThisSum > MaxSum)//如果刚得到的子列和更大,则更新结果 
                    MaxSum = ThisSum;
            }
        }//j循环结束 
    }//i循环结束
    return MaxSum; 
 } 
 
/*算法2------O(N^2)*/
int MaxSubseqSum1(int A[] ,int N)
{
    int ThisSum,MaxSum = 0;
    int i,j,k;
    for(i=0;i<N;i++)                //i是子列左端位置 
    {
        ThisSum=0;                    //ThisSum是A[i]-A[j]的子列和 
        for(j=i;j<N;j++)            //j是子列右端位置 
        {
            ThisSum +=A[j];//对于相同的i,不同的j,只要在j-1循环的基础上累加即可。 
            if(ThisSum > MaxSum)//如果刚得到的子列和更大,则更新结果 
                MaxSum = ThisSum;
            }
        }//j循环结束 
    }//i循环结束
    return MaxSum; 
} 

/*算法3------O(nlogn)分而治之*/


/*算法4------O(N)*/
int MaxSubseqSum1(int A[] ,int N)
{
    int ThisSum,MaxSum = 0;
    int i,j,k;
    ThisSum=0;                        //ThisSum是A[i]-A[j]的子列和 
    for(i=0;i<N;i++)                //i是子列左端位置 
    {
        ThisSum+=A[i];                //向右累加 
        if(ThisSum > MaxSum)        //如果刚得到的子列和更大,则更新结果
        MaxSum=ThisSum;
        else if(ThisSum<0)            //如果不能使后面部分和增大则舍去 
        ThisSum = 0; 
    }//i循环结束
    return MaxSum; 
 } 

 

 

 

结:算法+数据结构=程序。对算法有了初步的认识和了解后,将学习数据的逻辑结构(表,树,图,集合)和他们在机内的存储表示即存储结构。

看看我什么时候能将这个课程学完啊 = =   2017-12-09

 

posted @ 2017-12-09 16:03  Akmpfen  阅读(247)  评论(0编辑  收藏  举报