回到总目录:点击此处
◽概论
数据结构研究非数值计算的程序设计问题种计算机的操作对象以及它们之间的关系和操作
数据结构是指相互之间存在一种或多种特定关系的数据元素集合
数据:描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合
数据包含整型、实型、布尔型、图像、字符、声音等一切可以输入到计算机中的符号集合
数据类型 :是一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。
数据元素是组成数据的基本单位,是数据集合的个体,在计算机种通常作为一个整体进行考虑和处理
数据对象是性质形同的数据元素的集合,是数据的一个子集。
数据结构三要素:逻辑结构、储存结构和运算 Data_Structure= (D, R) D—元素有限集,R—关系有限集
数据的逻辑结构:
(具体问题抽象出来的数据模型,与数据的储存无关)
集合、线性、树、图
数据的储存结构:
又叫物理结构,是逻辑结构用计算机语言的实现
顺序、链式、索引、散列
顺序结构:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系
链式结构:借助指示元素存储地址的指针表示数据元素间的逻辑关系
抽象数据类型
数据类型:具有相同类型的数据的集合
原子类型:其值不可分解。如整型、实型、字符型、
结构类型:由若干成分按某种结构组成的,因此可以分解,并且它的成分可以是非结构的,也可也是结构的。
抽象数据类型ADT ,Abstract Data type
抽象数据类型最重要的特点是:数据抽象和信息隐蔽
数据的抽象和数据的封装
ADT 抽象数据类型名{
数据对象:<数据对象定义>
数据关系:<数据关系定义>
基本操作:<基本操作定义>
}ADT 抽象数据类型名
基本操作的定义格式:
操作名称 (参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
算法
算法的特征:有穷性、确定性(每个步骤由确定含义,没有二义性)、可行性、输入、输出
算法设计的基本要求
- 有穷性
一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。
- 确定性
算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。即对于相同的输入只能得出相同的输出。
- 可行性
一个算法是可行的,即算法中描述的操作都是吋以逋过已经实现的基本运算执行有限次来实现的。
- 输入
一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。
- 输出
一个算法有一个或多个的输出,这些输出是同输入有着某种特定关系的量。
正确性——满足解决问题的基本需求
- 没有语法错误
- 对于几组输入数据能够得出满足要求的结果
- 对于精心选择的典型、苛刻刁难性的几组输入数据能够得到满足要求的结果
- 对一切满足要求的数据能够得到满足要求的结果
可读性——便于阅读、理解和交流
健壮性——当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果
高效率和低存储量——算法执行的时间和算法执行过程中需要的最大存储空间
算法评价标准
问题规模:算法中所涉及的局部来看数据量的大小(通常用整数n表示)
一个特定算法的“运行工作量”的大小,只依赖于问题的规模,或者说它是问题规模的函数。
时间复杂度 T(n)
空间复杂度 S(n) 算法运行过程中临时所占的空间大小,不是程序本身的大小
例:
//N*N阶 矩阵相乘
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
c[i][j]=0; // 1
for(k=1;k<=n;k++)
{
c[i][j]=C[i][j]+a[i][k]*b[k][j]; //2
}
}
}
//语句1的执行次数是 n*n
//语句2的执行次数是 n*n*n
//所以总和 O(n^2+n^3)=O(n^3) 一般用O(n3)表示
y=y+1; //1. 时间复杂度为O(1) 称之为 常量阶
for (i=1;i<n;i++)
{
y=y+1; //2. 时间复杂度为O(n) 称之为 线性阶
for(j=0;j<(2*n);j++)
{
x++; //3. 时间复杂度O(n^2) 称之为 平方阶
}
}
O(log2n) 对数型 O(2n) 指数型 O(nlong2n) 二维型