考研408复习笔记—— 数据结构(一)

编写不易,希望各位看到能点个赞。

若发布的内容有什么错误,欢迎留言探讨。

一、绪论

1.1 数据结构的目的

1、如何用程序代码把现实世界的问题信息化

如:金钱信息化(支付宝、微信)、排队信息化(微信小程序排号等待提示),聊天软件(QQ、微信等)、点餐(美团外卖、饿了么)

2、如何用计算机高效地处理这些信息从而创造价值
如:金钱信息化(使用float进行存储)、排队(使用数组或者数据结构中的队列)

1.2 基本概念

1.2.1、数据

数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机并被计算机程序识别和处理的符号的集合。

数据是计算机程序加工的原料

1.2.2、数据元素、数据项

数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。

一个数据元素可由若干数据项组成,数据项是构成数据元素不可分割的最小单位

例如:在吃饭时使用基础的排队取号系统时,他将会存储每一波客户的相关信息(如下)。

   客户: 
			取号码
			取号时间
			客户人数

此时,这个客户的总体信息便是数据元素,而相应取号码、取号时间、客户人数则是数据元素中的三个数据项

1.2.3、数据对象、数据结构

结构:各个元素之间的关系

数据结构:相互之间存在一种或者多种特定关系的数据元素的集合。

数据对象:具有相同性质的数据元素的集合,是数据的一个子集。

举例:依旧是上面排队吃饭的例子

在某个门店排队的客户信息之间,存在一个取号先后和用餐先后的顺序(如下),那么便可以使用数据结构来对这一列有关系的数据进行存储。
在这里插入图片描述
同样的对于,其他门店也存在一样的排队信息,这时这两个数据之间具有相同的性质(号码先后等),我们就可以把他们看成是一个相同的数据对象

1.2.4、数据类型、抽象数据类型(ADT)

数据类型:一个值的集合和定义在此集合上的一组操作的总称。

1)原子类型:其值不可再分的数据类型
如:int、bool类型
2)结构类型:其值可以分解为若干成分(分量)的数据类型。
如:struct

抽象数据类型(ADT):抽象数据组织及与之相关的操作。通常不考虑存储结构。

1.3 三要素

讨论一种数据结构时,需要关注的三个方面

1.3.1、逻辑结构——数据元素之间的逻辑关系

集合:各个元素同属于一个集合,数据间没有其他关系

线性结构:数据元素之间是一对一的关系。
特点:除了第一个元素,所有元的都有唯一的前驱;除了最后一个元素,所有的元素都有唯一的后继。
在这里插入图片描述

树形结构:数据元素中存在一对多的关系(类似思维导图)
在这里插入图片描述

图状结构(网状结构):数据元素之间存在多对多的关系
在这里插入图片描述

1.3.2、物理结构(存储结构)——如何用计算机表示数据元素的逻辑关系

下列举例图逻辑结构,如下:
在这里插入图片描述

顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
在这里插入图片描述

链式存储:逻辑上相邻的元素在物理位置上可以不相邻,借助元素存储地址的指针来表示元素之间的逻辑关系。
在这里插入图片描述

索引存储:在存储元素信息的同时,还建立附加的索引表。索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)。

在这里插入图片描述

散列存储:根据元素的关键字直接解算出该元素的存储地址,又称“哈希(hash)存储”(详细看第六章)。

后三种统称为非顺序存储

【注】:
1、若采用顺序存储,各个数据元素在物理上必须连续的,若采用非顺序存储,啧各个数据元素在物理上可以离散的
2、数据的存储结构会影响存储空间分配的方便程度(增删数据)。
3、数据的存储结构会影响数据运算的速度(查找、修改数据)。

1.3.3、数据的运算

1、施加在数据上的运算包括运算的定义实现

2、运算的定义是针对逻辑结构的,用于指出运算的功能

3、运算的实现是针对存储结构的,用于指出运算的具体操作步骤

1.4 算法

在这里插入图片描述
算法:
如何处理数据结构中的信息,并用以解决实际问题。

1.4.1 五个特性

1、有穷性:一个算法必须在有穷步之后结束,且每一步都可在有穷时间内完成。
[注] 程序可以是无穷的(一直在运行),但是算法必须是有穷的(在一定步骤内解决某个问题)。

2、确定性:算法中每条指令必须有确切的含义,对于相同的输入只能得到相同的输出

3、可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。

4、输入:一个算法有零个或多个输入,这些输入取自于某个特定对象的集合。

5、输出:一个算法有一个或多个输出,这些输出与输入存在某些特定的关系。

1.4.2 “好”算法的特点

1、正确性。算法能够正确地解决问题。

2、可读性:算法应具有良好的可读性,以帮助人们理解。

3、健壮性:输入非法数据时,算法能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。

4、高效率与低存储量需求

1.5 时间复杂度(计算技巧、必考)

时间复杂度事前预估算法时间开销T(n)问题规模n的关系。

时间复杂度的计算,一般是考察主函数中的while和for循环以及递归函数中的时间开销与问题规模n之间的关系。
例如:

for(int i =1; i <=s;i++){
	i *= 2;
}

对于上面的这个例子我们可以看到,i在每一次的循环中他都会变成原来的2倍,也就是说最后要出现的结果过是:

S<=i=2x,x为计算的次数

相应的计算次数已转换就变成了x=log2S,S就是我们问题的规模将它替换成n,便可以得到时间复杂度T=O(log2n)。

使用O(n)进行表示:

1、一个算法的时间复杂度,可以只考虑时间复杂度公式中阶数最高的部分。

如:T(n)=3n+3,则T(n)=O(n);
T(n)=n2+3n,则T(n)=O(n2)

常见阶数比较如下:
在这里插入图片描述
计算复杂度时的加法与乘法:

在这里插入图片描述

2、对于代码的时间复杂度判断:
1)顺序执行的代码只会影响常数项,可以忽略。
2)只需要挑选循环中的一个基本操作来分析他执行次数与n的关系即可。
3)如果有多层嵌套循环,只需关注深层循环循环了几次。

3、评价时间复杂度时一般考虑最坏时间复杂度平均时间复杂度

1.6 空间复杂度

空间复杂度:用于衡量空间开销与问题规模n之间的关系。

程序运行时的内存需求= 程序代码+数据

在这里插入图片描述
如上图所示代码,无论n怎么变化,内存中的数据的大小都不会变化,因此该程序的空间复杂度S(n)=O(1)。

算法原地工作=算法的空间复杂度为函数。

在这里插入图片描述
如该算法,在n发生改变时,内存中的数据所用空间也将随之变大,根据算法推断,其变化与n成正比,因此该程序空间复杂度S(n)=O(n)。

1、与时间复杂度一样,空间复杂度只需考虑最大阶数。

2、计算空间复杂度时只需考虑与问题规模n相关的内存空间开销,一般为变量对内存的申请。

3、函数递归调用时也会带来内存的开销,递归时会同时开始对内存中申请多个变量,因此会影响空间复杂度。(如下图)
加粗样式
当n等于5时,就调用了5次函数,申请了5个内存。

具体递归时的空间复杂度,根据算法具体情况进行计算。

小结

在探讨一种数据结构时:
1)定义逻辑结构(数据元素之间的关系)
2)定义数据的预算(针对现实需求,应该对这种逻辑结构进行什么样的运算)
3)确定某种存储结构,实现数据结构,并实现一些对数据结构的基本运算。
着重点:
时间复杂度,算法的五个特性、逻辑结构,数据元素与数据项的关系。

后篇跳转

考研408复习笔记—— 数据结构(二)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值