数据结构笔记之绪论

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

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.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)




你可能感兴趣的:(数据结构,时间复杂度,概念,空间复杂度,绪论)