概括:
程序=数据结构+算法
programs=data structures➕algorithm
程序设计:为计算机处理问题编制的一组指令集合
算法:处理问题的策略
导入理解:
1.1:关于数据组织
插入点:如何将数据存储?
——此问题可延展为如何在书架上摆放图书,要确保以下两个操作方便实现。
操作1:怎样插入书
操作2:怎样找到指定的书
解析
方法一:随便放
操作1:哪里有空放哪里
造成操作2无法进行
方法二:按照书名的拼音字母顺序排放
操作2可二分查找
补充:二分查找,又叫折半查找,折半查找要求线性表必须采用顺序存储结构(数组),而且表中元素按关键字有序排列。
操作1插入新书效率太低
方法3:将书划分类别,每种类别按照书名拼音字母顺序排放
操作1:先定类别,二分查找确定位置,移出空位
操作2:先定类别,再二分查找
空间与类别要怎分配?
结论:解决问题方法的效率跟数据的组织方式有关
1.2关于空间使用
实现一个函数print N使得传入一个正整数为N的参数后,能顺利打印从1到N的全部正整数
//循环实现
Void PrintN(int n)
{int I;
For(i=1);i<=n;i++){
Printf("%d\n",N);
}
Return;
}
//递归实现
补充:一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的。用递归过程定义的函数,称为递归函数
Void PrintN(int n)
{if(n){
PrintN(n-1);
Printf("%d\n",N);
}
Return;
}
令n=100,1000,10000,100000,……
分别测试两个实现:
#include<stdio.h>
Void prinN(int n);
Int main()
{int n;
Scanf("id",&n);
printN(n);
Return 0;
}
//递归非正常终止跳出
结论:解决问题方法的效率跟空间的利用率有关
1.3关于算法效率
写程序计算给定多项式在定点x处的值
f(x)=a0+a1x+…+an-1xn-1+anxn
f(x)=a0+x(a1+x(…+an-1+x(an))…))
利用clock()函数可以捕捉
clock():捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”。
常数CLK_TCK:机器时钟每秒所走的时钟打点数。
用例:写程序计算给定多项式f(x)=xi,在给定点x=1.1处的值f(1.1)
测试程序:
注:此处测试f1与f2是重复的,可以写成一个函数
两个函数跑的太快了,所以结果出来都是零
让被测函数重复运行充分多次,使得测出的总的时钟打点间隔充分长,最后计算被测函数平均每次运行的时间即可
结论:解决问题的方法效率,还跟算法的巧妙程度有关系