编写不易,希望各位看到能点个赞。
若发布的内容有什么错误,欢迎留言探讨。
1、如何用程序代码把现实世界的问题信息化
如:金钱信息化(支付宝、微信)、排队信息化(微信小程序排号等待提示),聊天软件(QQ、微信等)、点餐(美团外卖、饿了么)
2、如何用计算机高效地处理这些信息从而创造价值
如:金钱信息化(使用float进行存储)、排队(使用数组或者数据结构中的队列)
数据是信息的载体
,是描述客观事物属性的数、字符及所有能输入到计算机并被计算机程序识别
和处理的符号的集合。
数据是计算机程序加工的原料
。
数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。
一个数据元素可由若干数据项组成,数据项是构成数据元素不可分割的最小单位
例如:在吃饭时使用基础的排队取号系统时,他将会存储每一波客户的相关信息(如下)。
客户:
取号码
取号时间
客户人数
此时,这个客户的总体信息便是数据元素
,而相应取号码、取号时间、客户人数则是数据元素中的三个数据项
。
结构:各个元素之间的关系
数据结构:相互之间存在一种或者多种特定关系
的数据元素的集合。
数据对象:具有相同性质
的数据元素的集合,是数据的一个子集。
举例:依旧是上面排队吃饭的例子
在某个门店排队的客户信息之间,存在一个取号先后和用餐先后的顺序(如下),那么便可以使用数据结构
来对这一列有关系的数据进行存储。
同样的对于,其他门店也存在一样的排队信息,这时这两个数据之间具有相同的性质(号码先后等),我们就可以把他们看成是一个相同的数据对象
。
数据类型:一个值的集合和定义在此集合上的一组操作的总称。
1)原子类型:其值不可再分的数据类型
如:int、bool类型
2)结构类型:其值可以分解为若干成分(分量)的数据类型。
如:struct
抽象数据类型(ADT):抽象数据组织及与之相关的操作。通常不考虑存储结构。
讨论一种数据结构时,需要关注的三个方面
逻辑关系
。集合:各个元素同属于一个集合,数据间没有其他关系
线性结构:数据元素之间是一对一的关系。
特点:除了第一个元素,所有元的都有唯一的前驱;除了最后一个元素,所有的元素都有唯一的后继。
表示
数据元素的逻辑关系顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中
,元素之间的关系由存储单元的邻接关系来体现。
链式存储:逻辑上相邻的元素在物理位置上可以不相邻
,借助元素存储地址的指针来表示元素之间的逻辑关系。
索引存储:在存储元素信息的同时,还建立附加的索引表
。索引表中的每项称为索引项
,索引项的一般形式是(关键字,地址)。
散列存储:根据元素的关键字直接解算出该元素的存储地址,又称“哈希(hash)存储”(详细看第六章)。
后三种统称为非顺序存储
。
【注】:
1、若采用顺序存储,各个数据元素在物理上必须连续的
,若采用非顺序存储,啧各个数据元素在物理上可以是离散的
。
2、数据的存储结构会影响存储空间分配的方便程度
(增删数据)。
3、数据的存储结构会影响数据运算的速度
(查找、修改数据)。
1、施加在数据上的运算包括运算的定义
和实现
。
2、运算的定义是针对逻辑结构
的,用于指出运算的功能。
3、运算的实现是针对存储结构
的,用于指出运算的具体操作步骤。
1、有穷性:一个算法必须在有穷步
之后结束,且每一步都可在有穷时间
内完成。
[注] 程序可以是无穷的(一直在运行),但是算法必须是有穷的(在一定步骤内解决某个问题)。
2、确定性:算法中每条指令必须有确切的含义,对于相同的输入
只能得到相同的输出
。
3、可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次
来实现。
4、输入:一个算法有零个或多个输入
,这些输入取自于某个特定对象的集合。
5、输出:一个算法有一个或多个输出
,这些输出与输入存在某些特定的关系。
1、正确性。算法能够正确地解决问题。
2、可读性:算法应具有良好的可读性,以帮助人们理解。
3、健壮性:输入非法数据时,算法能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。
4、高效率与低存储量需求
时间复杂度:事前预估
算法时间开销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、评价时间复杂度时一般考虑最坏时间复杂度
和平均时间复杂度
。
空间复杂度:用于衡量空间开销与问题规模n之间的关系。
程序运行时的内存需求= 程序代码+数据
如上图所示代码,无论n怎么变化,内存中的数据的大小都不会变化,因此该程序的空间复杂度S(n)=O(1)。
算法原地工作
=算法的空间复杂度为函数。
如该算法,在n发生改变时,内存中的数据所用空间也将随之变大,根据算法推断,其变化与n成正比,因此该程序空间复杂度S(n)=O(n)。
1、与时间复杂度一样,空间复杂度只需考虑最大阶数。
2、计算空间复杂度时只需考虑与问题规模n相关的内存空间开销,一般为变量对内存的申请。
3、函数递归调用时也会带来内存的开销,递归时会同时开始对内存中申请多个变量,因此会影响空间复杂度。(如下图)
当n等于5时,就调用了5次函数,申请了5个内存。
具体递归时的空间复杂度,根据算法具体情况进行计算。
在探讨一种数据结构时:
1)定义逻辑结构(数据元素之间的关系)
2)定义数据的预算(针对现实需求,应该对这种逻辑结构进行什么样的运算)
3)确定某种存储结构,实现数据结构,并实现一些对数据结构的基本运算。
着重点:
时间复杂度,算法的五个特性、逻辑结构,数据元素与数据项的关系。
考研408复习笔记—— 数据结构(二)