目录
1、数据结构的研究内容
数据结构的实质:提取操作对象,找出操作对象之间的关系。
现在的计算机主要处理信息之间的关系。
例如:学生学籍管理系统。
操作对象:若干行数据记录
操作算法:查询、插入、修改、删除等
操作对象之间的关系:线性关系
数据结构:线性数据结构、线性表
数据结构是一门研究非数值计算的程序设计中计算机的操作对象(表、数、图等)以及它们之间的关系和操作的学科
2、基本概念和术语
2.1数据
定义:能输入计算机且能被计算机处理的各种符号的集合。
通俗的说,数据是信息的载体,是将现实世界的事物符号化且能够被计算机识别、存储和加工
大致分为
- 数值型数据:整数、实数等
- 非数值型的数据:文字、图像、图形、声音等
2.1.1数据元素
定义:数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
ps:数据元素有简称为元素,或称为记录、结点或顶点
一个数据元素可由若干个数据项组成
2.1.2数据项
构成数据元素的不可分割的最小单位。
2.1.3数据对象
是性质相同的数据元素的集合,是数据的一个子集。
2.2数据结构
数据元素不是孤立存在的,他们之间存在着某种关系,称之为结构。
数据结构是指相互之间存在一种或多种特定关系的数据元素集合(数据结构是带结构的数据元素的集合)
数据结构包括以下三方面的内容:
- 数据元素之间的逻辑关系,也称为逻辑结构。
- 数据元素及其关系在计算机内存中的表示(及映像),称为数据的物理结构或数据的存储结构。
- 数据的运算和实现。
2.2.1逻辑结构
- 描述数据元素之间的逻辑关系
- 与数据的存储无关,独立于计算机
- 是从具体问题抽象出来的数学模型
逻辑结构通过不同的划分方法,分为不同的种类
划分方法一:
- 线性结构:有且仅有一个开始和一个终点结点,并且所有结点都最多只有一个直接前驱和一个直接后继。例如:线性表、栈、队列、串
- 非线性结构:一个结点可能有多个直接前驱和直接后继。例如:树、图
划分方法二——四类基本逻辑结构
- 集合结构:结构中的数据元素除了同属一个集合的关系外,无任何其他关系。
- 线性结构:结构中的数据元素之间存在一对一的线性关系。
- 树形结构:结构中的数据元素之间存在一对多的层次关系。
- 图状结构(网状结构):结构中的数据元素之间存在着多对多的任意关系。
2.2.2存储结构
- 数据元素及其关系在计算机存储器中的结构
- 是数据结构在计算机中的表示
有四种基本的存储结构
- 顺序存储结构:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。
- 链式存储结构:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用“指针”来表示。
- 索引存储结构:在存储结点信息的同时,还建立附加的索引表。
- 散列存储结构:根据结点的关键字直接计算出该结点的存储地址。
2.2.3逻辑结构与存储结构的关系
- 存储结构是逻辑关系的映像与元素本身的映像
- 逻辑结构是数据结构的抽象,存储结构是数据结构的实现
2.3数据类型
2.3.1数据类型
定义:数据类型是一组性质相同的值得集合以及定义于这个值集合上的一组操作的总称。
2.3.2抽象数据类型
定义:是指一个数学模型以及定义在此数学模型上的一组操作。
- 由用户定义,从问题抽象出数据模型(逻辑结构)
- 还包括定义在数据模型上的一组抽象运算(相关操作)
形式定义:(D,S,P)三元组
- D是数据对象;
- S是D上的关系集;
- P是对D的基本操作集:
定义格式:
数据对象、数据关系用伪代码描述即可
基本操作的定义格式为:
- 基本操作名(参数表)
- 初始条件
- 操作结果
#include<stdio.h>
typedef struct {
float realpart;//实部
float imagpart;//虚部
}Complex;//定义复数抽象类型
void assign(Complex* A, float r, float i) {
A->realpart = r;
A->imagpart = i;
}//赋值
void add(Complex* c, Complex a, Complex b) {
c->realpart = a.realpart + b.realpart;
c->imagpart = a.imagpart + b.imagpart;
}//加
void minus(Complex* c, Complex a, Complex b) {
}//减
void multiply(Complex* c, Complex a, Complex b) {
c->realpart = a.imagpart * b.imagpart + a.realpart * b.realpart;
c->imagpart = a.imagpart * b.imagpart + a.realpart * a.realpart;
}//乘
void divide(Complex* c, Complex a, Complex b) {//a是分子,b是分母
Complex x, y, z;
x.realpart = b.realpart;
x.imagpart = -b.imagpart;
multiply(&y, a, x);
multiply(&z, b, x);
c->realpart = y.realpart / z.realpart;
c->imagpart = y.imagpart / z.imagpart;
}//除
void GetReal(Complex* a) {
printf("%f", a->realpart);
}
void GetImag(Complex* a) {
if (a->imagpart > 0)
printf("+ %f i", a->imagpart);
else
printf("%f i", a->imagpart);
}
int main() {
Complex z1, z2, z3, z4, z;
float r, i;
assign(&z1, 8.0, 6.0);
//printf("%f", z1.realpart);
assign(&z2, 4.0, 3.0);
add(&z3, z1, z2);
multiply(&z4, z1, z2);
if (z3.imagpart == 0 && z3.realpart == 0) {
printf("不可计算");
}
else {
multiply(&z, z4, z3);
GetReal(&z);
GetImag(&z);
}
return 0;
}
3、算法和算法分析
3.1算法
定义:对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。(算法就是解决问题的方法和步骤)
算法的描述:
- 自然语言:英语、中文
- 流程图:传统流程图
- NS流程图
- 伪代码:类C语言
- 程序代码:各种高级语言
算法与程序
程序 = 数据结构 + 算法
- 数据结构通过算法实现操作
- 算法根据数据结构设计程序
算法特性
有穷性,确定性(每一条指令必须有确切的意思),可行性,有输入,有输出
算法设计的要求
- 正确性:算法满足问题要求你,能正确解决问题
- 可读性:易于别人和自己理解
- 健壮性:当输入非法数据时,算法恰当的做出反应或进行相应的处理
- 高效性:花费尽量少的时间和尽量低的存储需求
3.2算法分析
3.2.1算法的时间效率
时间效率:算法执行所消耗的时间
时间效率的度量:
- 事后统计:将算法实现,测算其时间开销。(易受外界因素影响)
- 事前分析:对算法所消耗资源的一种估算方法。
算法中基本语句重复执行的次数是问题规模n的某个函数。
基本语句重复执行的次数{
- 算法中重复执行次数和算法执行时间成正比的语句
- 对算法运行时间贡献最大
- 执行次数最多
}
问题规模n{
- 排序:n为记录数
- 矩阵:n为矩阵阶数
- 多项式:n为多项式的项数
- 集合:n为元素个数
- 树:n为树的结点个数
- 图:n为图的顶点数或边数
}
分析算法时间复杂度的基本方法
- 找到语句频度最大的那条语句作为基本语句
- 计算基本语句的频度得到问题规模n的某个函数
- 取其数量级用符号“O”表述
3.2.2算法的空间效率
空间效率:算法执行过程中所消耗的存储空间
空间复杂度:算法所需存储空间的度量
算法所要占据的空间
- 算法本身要占据的空间,输入/输出,指令,常数,变量等
- 算法要使用的辅助空间
时间效率和空间效率有时候是矛盾的。
加油~(^-^)V