浙大数据结构学习笔记之第一讲什么是数据结构
什么是数据结构
什么是数据结构?没有明确定义,陈越老师用 例1:如何摆放书架上的书籍 来引入。
要求:
图书的摆放要使两个相关操作得以方便实现:、
- 操作1:新书怎么插入?
- 操作2:已插入图书怎么寻找?
相对不好的实现方法:
- 随便放
- 按照字母顺序进行查找
这两类方法在数量大时都不易查找,量小时无所谓。
相对较好的实现方法:
- 操作1:新书怎么插入?
将图书分为不同的类别,同类别中按照字母顺序排放。插入新书时,按照二分法查找,留出空位。 - 操作2:已插入图书怎么寻找?
先定类别,再按二分法定位。
随之而来的有两个问题:怎么分类?分类具体有多细?
结论1: 解决问题方法的效率,和组织数据的方式有关。
例2:写程序实现一个函数PrintN,使得
传入一个正整数为N的参数后,能顺序
打印从1到N的全部正整数
很简单的问题,但是有不同的实现方法:
- 循环实现
void PrintN(int N){
for(int i=1;i<=N;i++)
printf("%d\n",i);
}
- 递归实现
简洁、易于理解,但不易实现,空间复杂度高。
void PrintN(int N)
{
if(N)
{
PrintN(N-1);
printf("%d\n",N);
}else{
return;
}
}
结论2: 解决问题方法的效率,和空间利用率有关。
- 暴力实现
double f(int n,double a[],double x){
double sum=a[0];
for(int i=1;i<n;i++)
{
sum+=a[i]*pow(x,i);
}
return sum;
}
- 按数学公式改进
double f(int n,double a[],double x){
double sum=a[n];
for(int i=n;i>0;i--)
{
sum=a[i-1]+x*sum;
}
return sum;
}
#include <stdio.h>
#include <math.h>
#include <time.h>
clock_t start,stop;
#define MAX 100000 /*多项式最大项数*/
#define COUNT 1e7 /*被测函数调用充分大次数方便计算*/
/*暴力法*/
double f1(int n,double a[],double x){
double sum=a[0];
for(int j=0;j<COUNT;j++){
for(int i=1;i<n;i++)
{
sum+=a[i]*pow(x,i);
}
}
return sum;
}
/*公式法*/
double f2(int n,double a[],double x){
double sum=a[n];
for(int j=0;j<COUNT;j++){
for(int i=n;i>0;i--)
{
sum=a[i-1]+x*sum;
}
}
return sum;
}
int main(void)
{
double a[MAX]; /*多项式系数*/
double duration; /*被测函数所用时间*/
for(int i=0;i<MAX;i++)
a[i]=i+1;
start=clock(); /*开始计时*/
f1(MAX,a,1.1);
stop=clock(); /*结束计时*/
duration=((double)(stop-start))/CLK_TCK;
printf("%f\n",duration/COUNT);
printf("%6.2e\n",duration/COUNT);
start=clock();
f2(MAX,a,1.1);
stop=clock();
duration=((double)(stop-start))/CLK_TCK;
printf("%f\n",duration/COUNT);
printf("%6.2e\n",duration/COUNT);
return 0;
}
结论3: 解决问题方法的效率,和算法的巧妙程度有关。
所以什么才是数据结构?
数据对象在计算机中的组织方式:逻辑结构和物理存储结构;
数据对象必然与加在其上的一系列的操作有关;
完成这些操作所用的方法就是算法。
以下部分感到难以理解: