day01 数据结构和clock()

本文探讨了数据结构在解决问题中的重要性,通过不同图书摆放策略和多项式计算方法的对比,说明了数据组织方式、空间利用效率及算法设计对解决方法效率的影响。同时介绍了抽象数据类型的概念,并给出了矩阵的抽象数据类型定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
} 

注意:程序较短不便于测出时间时,可以利用循环使一个程序执行多次在计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值