数据结构笔记之绪论

来源:互联网 发布:全球云计算公司排名 编辑:程序博客网 时间:2024/05/21 10:13

合理地组织数据,高效地处理数据是数据结构的主要研究的问题。

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,虚部为yGetReal(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.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+1 
2.算法的时间复杂度定义

上例中,当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;}

常见的时间复杂度按数量级递增依次为:常量阶、对数阶、线性阶、线性对数阶、平方阶、立方阶,,,K次方阶、指数阶

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)




0 0
原创粉丝点击