合理地组织数据,高效地处理数据是数据结构的主要研究的问题。
1.1数据结构的研究内容
数据结构主要研究非数据计算问题,即无法用数学方法建立数学模型的问题,例如建立一张学生信息表(线性)、人机对弈(树)、最短路径(图)等等。
1.2基本概念和术语
1.2.1数据、数据元素、数据项、数据对象
数据:客观事物的符号表示,使所有能输入到计算机并被计算机程序处理的符号的总称。如数,字符串、图像。
数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。比如学生信息表中一名学生的信息,人机对弈时的一种状态,图中的一个顶点。
数据项:组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生的 学号、姓名、年龄等等都是数据项。
数据对象:性质相同的数据元素的集合,是数据的一个子集。例如学生中大于20岁的集合。
1.2.2数据结构
数据结构是相互之间存在一种或多种特地关系的数据源的集合。
数据结构包括逻辑结构和存储结构两个层次。
1.逻辑结构
数据的逻辑结构是从逻辑关系上描述数据。可以看做是从具体问题中抽象出来的数学模型。
逻辑结构有两个要素:一是数据元素,二是关系。四种基本的逻辑关系:集合、线性‘、树、图。
2存储结构
数据对象在计算机中的存储表示称为存储结构。
数据元素在计算机中有两种基本的存储结构,分别是顺序存储结构(数组)和链式存储结构(链表)。
1.2.3数据类型和抽象数据类型
数据类型例如C语言中的整型、浮点型等等。抽象数据类型是用户自己定义的、表示应用问题的数据类型,C++中可以用类表示。
1.3抽象数据类型的表示与实现
举个例子:对复数进行操作。
①定义部分:
ADT Complex{ Creat(&C, x, y); //构造复数C,实部为x,虚部为y GetReal(C); //返回实部 GetImag(C); //返回虚部 Add(C1, C2); //返回两数之和 Sub(C1, C2); //两数之差 } ADT Complex②表示部分
typedef struct { float Realpart; //实部 float Imagepart; //虚部 }Complex;③实现部分
void Create(&Complex C, float x, float y) { C.Realpart=x; C.Imagepart=y; } float GetRel(Complex C) { return C.Realpart; } float GetImag(Complex C) { return C.Imagepart; } Complex Add(Complex C1, Complex C2) { Complex sum; sum.Realpart=C1.Realpart+C2.Realpart; sum.Imagepart=C1.Imagepart+C2.Imagepart; return sum; } Complex Sub(Complex C1, Complex C2) { Complex sum; sum.Realpart=C1.Realpart-C2.Realpart; sum.Imagepart=C1.Imagepart-C2.Imagepart; return sum; }
数据结构与算法存在着本质联系。
1.4.1算法的定义及特性
算法是为了解决某类问题而规定的一个有限长的操作序列。
算法需要满足的特性:有穷性、确定性、可行性、输入、输出。
1.4.2评价算法优劣的基本标准
算法优劣可以从这几个方面来评价:正确性、可读性、健壮性、高效性(包括时间复杂度和空间复杂度)。
1.4.3算法的时间复杂度
1.问题规模和语句频度
问题规模是算法求解问题的输入量是多少,例如排序时数据的个数。
一条语句的重复执行次数称为语句频度。
for(i=0;i<=n;i++) //n+1 { for(j=1;j<=n;j++) //n*(n+1) { c[i][j]=0; //n*n for(k=1;k<=n;k++) //n*n*(n+1) { c[i][j]+=a[i][j]*b[i][j]; //n*n*n } } } f(n)=2n*n*n+3n*n+2n+12.算法的时间复杂度定义
上例中,当n趋近于无穷大是f(n)/n*n*n=2;
比是一个不等于零的常数,就说明f(n)与n的三次是同一个数量级,记作T(n)=O(f(n))=O(n的三次)
T(n)即为时间复杂度
3.算法时间复杂度举例
定理:T(n)=f(n)中最高次项=O(n的m次)
常量阶T(n)=O(1) { x++;s=0; } for(i=0;i<1000;i++) { x++; s=0; } 线性阶 for(i=0;i<n;i++) { x++; s=0; } 平方阶 x=0;y=0; for(k=1;k<=n;k++) { x++; } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { y++; } } 对数阶 fpr(i=01;i<=n;i=i*2) { x++; s=0; }
4.最好、最坏和平均时间复杂度
同字面意思
1.4.4空间算法复杂度
举例说明
算法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]; }相比以上两个算法,第一个只用了一个辅助变量t,空间复杂度为O(1),
第二个用了一个数组,空间复杂度为O(n)