从例子看数据结构

例子1 如何在书架上摆放图书

图书的摆放要使得两个操作方便实现

操作1 新书怎么插入
操作2 怎么找到某本特定的书

方法1
随便放
操作1 新书就插入到末尾
操作2 找书的时候一本一本慢慢找,最后累死

方法2
按照书名首字母摆放
操作1 新书先用二分法找到一个合适位置 然后后面的书往后挪(如果书太多 实在麻烦)
操作2 用二分法找到一本书

方法3
把书架划分为几个区域 每个区域放同类的书 同类的书再用书名首字母摆放

操作1 二分查找确定位置 移出空位
操作2 先定类别 再二分查找

产生问题 空间如何分配 要分多细

看来方法3是方法1和方法2的结合版

得出结论:
解决问题方法的效率,跟数据的组织方式有关

例二
写一个程序 打印出1到N的数字
循环实现

#include<stdio.h>
void print(int N)
{
int i;
for(i=1;i<=N;i++)
printf("%d\n",i);   
}

int main()
{
    print(1000); /*数字无论多大 都不会崩溃*/
 } 

运行良好

递归实现

include<stdio.h>
void print(int N)
{
if(N>1)
print(N-1);
printf("%d\n",N);
}

int main()
{
    print(100000); /*数字太大 空间不足*/
 } 

立刻炸掉

结论:解决问题方法的效率 跟空间的利用效率有关

例子3这里写图片描述

用clock函数 测试时间
第一种算法是常规的算法
第二种算法是秦九韶算法

#include<stdio.h>
double f1(int n,double a[],double x)
{
    int i;
    doule p=a[0];
    for(i=1;i<=n;i++)
    p+=(a[i]*pow(x,i));
    return p;
}
double f2(int n,double a[],double x)
{
    int i;
    doule p=a[n];
    for(i=n;i>0;i--)
        p=a[i-1]+x*p;
        return p;
}

clock 函数介绍
这里写图片描述

这里写图片描述

#include<stdio.h>
#include<math.h>
#include<time.h>
clock_t start,stop;
double duration;
#define MAXN 10 /*多项式最大项数*/ 
double f1(int n,double a[],double x)
{
    int i;
    double p=a[0];
    for(i=1;i<=n;i++)
    p+=(a[i]*pow(x,i));
    return p;
}
double f2(int n,double a[],double x)
{
    int i;
    double p=a[n];
    for(i=n;i>0;i--)
        p=a[i-1]+x*p;
        return p;
}
int main()
{
    int i;
    double a[MAXN];/*存储系数*/
    for(i=0;i<MAXN;i++)
      a[i]=(double)i;

     start=clock();
     f1(MAXN-1,a,1.1);
     stop=clock();
     duration=((double)(stop-start))/CLK_TCK;
     printf("ticks1=%f\n",(double)(stop-start));
     printf("duration=%6.2e\n",duration);

      start=clock();
     f2(MAXN-1,a,1.1);
     stop=clock();
     duration=((double)(stop-start))/CLK_TCK;
     printf("ticks1=%f\n",(double)(stop-start));
     printf("duration=%6.2e\n",duration);
 } 
 运行结果全为0
因为只测试一次时间微不足道 所以要循环一个较大的数目 

代码补充

include<stdio.h>
#include<math.h>
#include<time.h>
clock_t start,stop;
double duration;
#define MAXK 1e7  /*重复调用次数*/ 
#define MAXN 10 /*多项式最大项数*/ 
double f1(int n,double a[],double x)
{
int i;
double p=a[0];
for(i=1;i<=n;i++)
p+=(a[i]*pow(x,i));
return p;
}
double f2(int n,double a[],double x)
{
int i;
double p=a[n];
for(i=n;i>0;i--)
p=a[i-1]+x*p;
return p;
}
int main()
{
int i;
double a[MAXN];/*存储系数*/
for(i=0;i<MAXN;i++)
  a[i]=(double)i;
 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("duration=%6.2e\n",duration);

  start=clock();
  for(i=0;i<MAXK;i++)
 f2(MAXN-1,a,1.1);
 stop=clock();
 duration=((double)(stop-start))/CLK_TCK/MAXK;
 printf("ticks1=%f\n",(double)(stop-start));
 printf("duration=%6.2e\n",duration);
 } 

运行结果截图
这里写图片描述

结论 解决问题方法的效率,跟算法的巧妙有关

这里写图片描述

这里写图片描述

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值