数据结构与算法笔记第1章 绪论

目录

基本概念

1.数据:数值型和非数值型
2.数据元素:是数据的基本单位
3.数据项:构成数据元素的最小单位
4.数据>数据元素>数据项
5.数据对象:性质相同的数据元素的集合
6.数据结构:数据元素相互之间的关系

逻辑结构

1.线性结构:有且仅有一个开始和一个终端结点,并且所有结点最多只有一个直接前趋和一个直接后继
2.非线性结构:一个结点可能有多个直接前趋和直接后继

存储结构

1.顺序存储结构
2.链式存储结构(指针)

抽象数据类型的表示与实现

例:关于圆的函数
1.抽象 类型定义

ADT Complex{
	数据对象:D={r1,r2|r1,r2都是实数}
	数据关系:S={<r1,r2>|r1是实部,r2是虚部}
	基本操作:
	assign(&C,v1,v2)
			初始条件:空的复数C已存在
			操作结果:构造复数C,r1,r2分别被赋以参数v1,v2的值
	add(Complex *C,Complex *A,Complex *B)
			初始条件:复数A,B已存在
			操作结果:复数A,B被相加,返回复数C
			……
}ADT Complex

2.将上面的抽象类型定义转化为C语言形式

/*定义数据类型*/
typedef struct{
		float realpart;//实部
		float imagpart;//虚部
}Complex               //定义复数抽象类型
/*函数声明*/
void assign(Complex *A,float real,float imag);//赋值
void add(Complex *C,Complex A,Complex B);//销毁
/*具体的构造函数*/
void assign(Complex *A,float real,float imag)
{
	A->realpart=real;//实部赋值
	A->imagpart=imag;//虚部赋值
}
void add(Complex *C,Complex A,Complex B)
{
	C->realpart=A.realpart+B.realpart;//实部相加
	C->imagpart=A.imagpart+B.imagpart;//虚部相加
}

例:求复数 8+6i 和 4+3i 的和以及他们的积?PS:除法运算规则太难

/*
运行结果:
add:12.0+9.0i
multiply:14.0+48.0i
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
	float realpart;//实部
	float imagpart;//虚部
}Complex;
void assign(Complex* C, float real, float imag);
void add(Complex* C, Complex A, Complex B);
void multiply(Complex* C, Complex A, Complex B);
float Getreal(Complex C);
float Getimag(Complex C);
int main()
{
	Complex C, C1, C2, D1, D2;
	float Real = 0, Imag = 0;
	assign(&C1, 8.0, 6.0);
	assign(&C2, 4.0, 3.0);
	add(&D1, C1, C2);
	Real=Getreal(D1);
	Imag=Getimag(D1);
	printf("add:%.1lf+%.1lfi\n", Real, Imag);
	multiply(&D2, C1, C2);
	Real = Getreal(D2);
	Imag = Getimag(D2);
	printf("multiply:%.1lf+%.1lfi\n", Real, Imag);
	return 0;
}
void assign(Complex* C, float real, float imag)
{
	C->realpart = real;
	C->imagpart = imag;
}
void add(Complex* C, Complex A, Complex B)
{
	C->realpart = A.realpart + B.realpart;
	C->imagpart = A.imagpart + B.imagpart;
}
void multiply(Complex* C, Complex A, Complex B)
{
	C->realpart = A.realpart * B.realpart - A.imagpart * B.imagpart;
	C->imagpart = A.imagpart * B.realpart + A.realpart * B.imagpart;
}
float Getreal(Complex C)
{
	return C.realpart;
}
float Getimag(Complex C)
{
	return C.imagpart;
}

算法特性

	 有穷性
	 确定性
 	 可行性
	 输入
	 输出

算法效率

1.时间效率
算法运行时间=∑ 每条语句的执行次数*该语句执行一次所需的时间,算法运行时间和算法本身无关,由软硬件环境决定的;

f(1)<f(log2n)<f(n)<f(nlog2n)<f(n2)<f(n3)<f(2n)<f(n!)

例1:两个 n*n 矩阵相乘的算法可描述为?

for(i=1;i<=n;i++)                             //n+1次
	for(j=1;j<=n;j++)                         //n*(n+1)次
	{
		c[i][j]=0;                            //n*n次
		for(k=0;k<n;k++)                      //n*n*(n+1)次
			c[i][j]=c[i][j]+c[i][k]*c[k][i];  //n*n*n次
	}

(1)上述算法的时间消耗T(n)为:T(n)=2n3+3n2+2n+1称O(f(n))为算法的渐进时间复杂度——求出的T(n)函数的数量级,综上所述,T(n)=O(n3)为该算法的时间复杂度;
(2)是用公式计算;

例2:

for(i=1;i<=n;i++)
	for(j=1;j<=i;j++)
		for(k=1;k<=j;k++)
			x=x+1;

公式计算

例3:

i=1;
while(i<=n)
	i=i*2;

若循环执行1次:i=1* 2=2
若循环执行2次:i=2* 2=22
若循环执行3次:i=22* 2=23
……
若循环执行x次:i=2x
2x<=n
x<=log2n
f(n)=log2n

2.空间效率
空间复杂度:算法所需存储空间的量度记作:S(n)=O(f(n));
例:比较两个代码理解

//代码1 S(n)=O(1)
for(i=0;i<n/2;i++)
{
	a[i]=a[n-1-i];
}
//代码2 S(n)=O(n)
for(i=0;i<n;i++)
{
	b[i]=a[n-1-i];
}
for(i=0;i<n;i++)
{
	a[i]=b[i];
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清纯献给了作业

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值