day01 数据结构和clock()
一、数据结构的介绍
1.什么是数据结构?
- 没有具体定义
- 解决问题方法的效率,与数据的组织方式有关;
- 解决问题方法的效率,与空间的利用效率有关;
- 解决问题方法的效率,与算法的巧妙程度有关。
2.解决问题方法的效率,与数据的组织方式有关
- 如何在书架上摆放图书?
方法1:随便放(哪里有空放哪里;找书…累死)
方法2:按照书名的拼音字母顺序排放(查找方法:二分查找)
方法3:把书架划分成几块区域,每块区域指定拜访某类别的图书;在每种类别内,按照书名的拼音字母顺序排放。
新书插入:先定类别,二分查找确定位置,移出空位。
查找书籍:先定类别,再二分查找。
问题:空间如何分配?类别应该分多细?
3.解决问题方法的效率,与空间的利用效率有关
- 写程序实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从1到N的全部正整数?
- 主函数
#include "stdio.h"
int main()
{
int N;
scanf("%d",&N);
PrintN(N);
}
- 循环实现:速度快
void PrintN(int N)
{
int i;
for(i=1;i<=N;i++)
{
printf("%d\n",i);
}
return;
}
- 递归实现:相对速度慢,N=10000时程序崩溃不执行
void PrintN(int N)
{
if(N)
{
PrintN(N-1);
printf("%d\n",N);
}
return;
}
- 解决问题方法的效率,与算法的巧妙程度有关。
- 写程序计算给定多项式在顶点x处的值?(还没看懂…)
//方法一
double f(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 f(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;
}
5 抽象数据类型
- 数据类型
- 数据对象集
- 数据集合相关联的操作集 - 抽象:描述数据类型的方法不依赖于具体实现
- 与存放数据的机器无关
- 与数据存储的物理结构无关
- 与实现操作的算法和编程语言均无关 - 只描述数据对象集合相关操作集“是什么”,并不涉及“如何做到”的问题。
二、矩阵
1."矩阵"的抽象数据类型定义
- 类型名称:矩阵(Matrix)
- 数据对象集:一个M*N的矩阵是由M * N个元素<a,i,j>构成,
其中a是矩阵元素值,i是元素所在行号,j是元素所在列号
- 操作集:对于任意矩阵A、B、C∈Matrix,以及整数I,J,M,N
Matrix Create( int M, int N ):返回一个M*N的空矩阵
int GetMaxRow(Matrix A):返回矩阵A的总行数
int GetMaxCol(Matrix A):返回矩阵A的总列数
ElementType GetEntry(Matrix A, int i, int j) :返回矩阵A的第i行、第j列的元素
Matrix Add(Matrix A, Matrix B):如果A和B的行、列数都一致,则返回矩阵C=A+B,否则返回错误标志
Matrix Multiply(Matrix A, Matrix B):如果A的列数等于B的行数,则返回矩阵C=AB,否则返回错误标志。
2.clock()工具
- 作用:捕捉从程序开始运行到clock()被调用时所耗费的时间,这个时间单位是clock tick“时钟打点”
- 实例:
#include "stdio.h"
#include "math.h"
#include "time.h"
//clock_t是clock()函数返回的变量类型
clock_t start,stop;
//记录被测函数运行时间,以秒为单位
double duration;
//被测函数PrintN()
void PrintN(int N)
{
int i;
for(i=1;i<=N;i++)
{
printf("%d\n",i);
}
return;
}
int main()
{
//不在测试范围内的准备工作写在clock()调用之前
start = clock(); // 开始计时
PrintN(10); //这里写被测函数
stop = clock(); // 停止计时
duration = ((double)(stop - start));//计算运行时间
printf("%.2f\n",duration);
//其他不在测试范围的处理写在后面
return 0;
}
注意:程序较短不便于测出时间时,可以利用循环使一个程序执行多次在计算
。