数据结构-绪论(待修改)

c1 绪论

一.什么是数据结构

概括说,数据结构是一门讨论“描述现实世界实体的数学模型”(非数值计算)以及上的操作在计算机中如何表示和实现的学科。

二.基本概念和术语

1.数据:


2.数据元素


3.数据结构:带结构(指的是数据元素之间存在的关系)的数据元素的集合


4.从关系结构上分,数据结构可以分为四类:
a.线性结构
b.树形结构
c.回状结构
d.集合结构


5.数据结构的形式化描述
数据结构是一个二元组

data_structures=(D,S)
D:S数据元素的有限集
S:D上关系对的有限集

数据结构包括 逻辑结构 和 物理结构两个方面。
逻辑结构: 是对数据元素之间的逻辑关系之间的描述,它可以为一个数据元素的集合和定义在此集合上的若干关系来表示。
物理结构(存储结构):是数据结构在计算机中的表示和实现。


6.数据的存储结构----逻辑结构在存储器中的映像。
数据元素=用二进制的位串表示数据元素
关系=顺序映像,非顺序映像

a.顺序映像:(顺序存储方式)
b.链式存储方式:以附加信息(指针)表示后续关系。
c.索引存储方式
d.散列储存方式
在这里插入图片描述


7.数据类型:
在这里插入图片描述
基本类型不可再分。指针不能再分,枚举不可再分。


8.数据对象:
在这里插入图片描述


9.抽象数据类型:
在这里插入图片描述


在这里插入图片描述


11.数据的逻辑结构和存储结构是密不可分的两个方面。一般来说,一种是数据的逻辑结构更具需要可以用多种存储结构来储存。而采用不同的存储结构,其数据处理的效率也往往是不同的。


三.算法和算法分析

1.算法:是对特定问题的求解步骤的一种描述。算法是指令的有限序列,其中每一条指令表示一个或者多个操作。
特性:
1).有穷性
2).确定性
3).可行性
4).输入
5).输出

算法与程序:十分相似,但是又有区别。一个程序不一定满足有穷性。程序中的指令必须则无此限制。算法代表对问题的解释,二程序则是代表了算法在计算机中的特定表现。一个算法若用程序设计语言来描述,则就是一个程序。

算法与数据结构:是相辅相成的。解决某一特定问题的算法可以选定不同的数据结构,而且选择恰当与否直接影响算法的效率。反之,一种数据结构的优劣由各种算法的执行来体现。

算法设计的要求:
评价一个好的算法有以下几个标准:
1)正确性:
2)可读性:
3)健壮性:
4)效率与存储量需求:
效率指的是算法执行的时间;存储量需求是指算法执行过程中所需要的最大储存空间。

3.算法效率的衡量方法和准则;
通常有两种算法效率的方法:
事后统计法:缺点:a.必须执行程序;b.其他因素掩盖算法的本质(…)
事前分析估算法:取一部分。

和算法执行时间相关的因素:
1.算法选用的策略。
2.问题的规模
3.编写程序的语言
4.编写程序产生的机器代码质量
5.计算机的执行指令的速度

一个特定的算法的“运行工作量”的大小,只依赖于问题的规模(通常用整数n来表示),或者说,他是问题规模的函数。把1,3,4,5当作常数
假如,随着问题规模n的增长,算法执行时间的增长率和f(n)的增长率相同,则可记作;
T(n)=O(f(n))
O()只是一个标记,不要把他理解成函数。理解成一种关系。T(n)为算法的渐近时间复杂度。也就是之前的算法执行时间的增长率。

如何估算时间复杂度呢?
算法=控制结构+原操作(固有数据类型的操作)
算法的执行时间=原操作(i)的执行次数 X 原操作(i)的执行时间。:算法的执行时间 与 原操作执行次数之和成正比。

从算法中选取一种对于所研究的问题来说是基本操作的原操作,以该基本操作在算法中的重复执行的次数作为算法运行时间的衡量。


例题1:

for(i=1;i<=n;++i){
    
    
		for(j=1;j<=n;++j){
    
    
			c[i]c[j]=0;
			for(k=1;k<=n;++k)
				c[i][j]+=a[i][j]*b[k][j];这个是最内层,循环体执行n^3次。基本操作
		}
	} 
	这是一个三重循环,每一次第一层循环n次,总循环n*n*n次

所以时间复杂度T(n)=O(n^3)
频度:是指该语句重复执行的次数。


例题二:

{
    
    ++x,s=0;}
将x自增看作是基本操作,则语句频度为一,即时间复杂度为O	(1);
如果将s=0也看做是基本操作,则语句1频度为2,其时间复杂度任然是O(1),即常量阶。哪怕频度是100.也是1

例题三:

for(i=1;i<=n;++i)
{
    
    
	++x;
	s+=x;
}
语句频度:2n
其时间复杂度为:O(n),即时间复杂度为线性阶。(那么说n,2n,3n,4n...

例题四:
在这里插入图片描述


![在这里插入图片描述](https://img-blog.csdnimg.cn/20200320181434819.png?x-oss-process=image /watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTg0MDA4Nw==,size_16,color_FFFFFF,t_70)


例题五:

在这里插入图片描述所以,时间复杂度为O(n^2),即此算法的时间复杂度为平方阶。


以下六种:
在这里插入图片描述


有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同:
例题:

viod bubble-sort(int a[],int n)
	for (i=n-1,change=TRUE;i>1&&change;--i)
	{
    
    
		change=false;
		for(j=0;j<1;++j)
			if(a[j]>a[j+1])
			  {
    
    a[j]=a[a+j];change=true;}
	}

在这里插入图片描述


(四):算法的存储空间的需求
算法的空间复杂度定义为:
S(n)=O(g(n))
表示随着问题规模n的增大,算法运行所需的存储量的增长率与g(n)的增长率相同。

算法的存储量包括:
1.输入数据所占空间。
2.程序本身所占空间。
3.辅助变量所占空间。

若输入数据所占空间只取决与问题本身,和算法无法,则只需要分析除了输入数据和程序之外的辅助变量所占的额外空间。

若所需要的额外空间相对于输入数据量来说是常数,则称为算法为原地工作。

若所需存储量依赖于特定的输入,则通常按照最坏的情况考虑。

猜你喜欢

转载自blog.csdn.net/weixin_45840087/article/details/105000657