数据结构是一门描述非数值计算的程序设计中,计算机的操作对象以及它们之间的关系和操作的学科。
1.基本概念和术语
数据项->数据元素->数据对象->数据结构
数据项:构成数据元素的不可分割的最小单位。eg.0002-李明-男-1985/12/25/-党员
数据元素:数据的基本单位。eg.1985/12/25
数据对象:性质相同的数据元素的集合。eg.整数集、字母字符集
2.数据结构
数据结构是带结构的数据元素的集合,包括逻辑结构、存储结构(物理结构)、数据的运算和实现。
数据结构的种类:
划分方式一:线性结构、非线性结构
划分方式二:集合结构、线性结构(1v1)、树形结构(1vn)、图状结构(nvn)
逻辑结构:从具体问题抽象出的数学模型,描述数据元素之间的逻辑关系
存储结构:数据元素及其关系在计算机存储器中的存储方式,包括顺序存储结构、链接存储结构、索引存储结构、散列存储结构
1.顺序存储结构:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置表示。c语言中用数组来实现。eg.数组
2.链接存储结构:用一组任意的存储单元存储数据元素数据,元素之间的逻辑关系由指针表示。c语言中用指针来实现。eg.链表
逻辑结构是数据结构的抽象,存储结构是数据结构的实现,二者综合起来建立了数据元素之间的结构关系。
3.数据类型
数据类型:一组性质相同的值的集合以及定义于集合上的一组操作的总称。
作用:约束变量或常量的取值范围和操作。如,int型只能取[-32768,32767],在此基础上进行+-*/%等操作。
抽象数据类型:数学模型以及定义在该模型上的一组操作,包括数据对象、数据关系、基本操作,使用类语言描述。
4.算法
算法:对特定问题的求解方法和步骤的描述。
描述方式:自然语言、流程图、伪代码/类语言、程序代码
特性:有穷性(执行步骤、时间)、确定性(执行路径)、可行性、输入、输出
设计要求:正确性、可读性、健壮性(鲁棒性)(针对异常、错误处理)、高效性
算法效率:时间效率、空间效率。
时间效率的度量方法:事前分析、事后分析
5.算法分析
事前分析方法:算法运行时间=∑每条语句频度*单位时间(语句频度:每条语句的执行次数)
为了便于比较不同算法的时间效率,仅比较它们的数量级。一般不计算所有操作的执行次数,只考虑基本操作的执行次数,记作T(n)。
若存在函数f(n),使得lim(n->∞)T(n)/f(n)=C,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),O(f(n))为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度。
分析算法时间复杂度的基本方法:
1.找出语句频度最大的那条语句作为基本语句;
2.计算基本语句的频度得到问题规模n的函数f(n);
3.取其数量级用符号“O”表示。
//eg.nxn矩阵相乘的算法可描述为:
for(int 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]+a[i][j]*b[i][j]; //n*n*n次
}
//eg.某些情况T(n)与输入数据集有关,如顺序查找:
for(i=0;i<n;i++)
if(a[i]==e) return i+1;
return 0;
最好情况:1次,最坏情况:n,平均时间复杂度:O(n)
//易错题,分析一下程序段的时间复杂度:
i=1;
while(i<=n)
i=i*2;
,取最大值,
对于复杂的算法,可以分部然后利用加法法则和乘法法则计算。
加法规则
乘法规则
O(n)复杂度排序(由简单到复杂)
渐进空间复杂度:算法所需存储空间的度量,记作S(n)=O(f(n))
算法占据的空间=本身要占据的(输入/输出、指令、变量、常量)+辅助空间
//eg.将一维数组中的数逆序存放到原数组中
//算法1
for(i=0;i<n/2;i++){
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
}
//算法2
for(i=0;i<n;i++)
b[i]=a[n-i-1];
for(i=0;i<n;i++)
a[i]=b[i];
算法1:S(n)=O(1);算法2:S(n)=O(n)