文章目录
1.2.1数据结构(Data Structure)
数据结构包括以下三个方面的内容:
- 数据元素之间的逻辑关系,称为逻辑结构
- 数据元素及其关系在计算机内存中的表示,称为数据的物理结构或数据的存储结构
- 数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现。
逻辑结构与存储结构的关系
- 存储结构是逻辑关系的映像和元素本身的映像
- 逻辑结构是数据结构的抽象,存储结构是数据结构的实现
- 两者综合就建立了数据元素之间的结构关系
逻辑结构的种类
划分方法一
(1) 线性结构
有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继
例如:线性表、栈、队列和串
(2) 非线性结构
一个结点可能有多个直接前趋和直接后继
如:树、图
划分方法二-四种基本逻辑结构
(1) 集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无任何其它关系
(2) 线性结构:结构中的数据元素存在一对一的线性关系
(3) 树形结构:结构中的数据元素存在一对多的层次关系
(4) 图形结构:结构中的数据元素间存在多对多的任意关系
存储结构的种类
-
.顺序存储结构
顺序存储结构是把数据元素存放在连续的存储单元里,数据元素之间的逻辑关系是通过数据元素的位置。
-
.链式存储结构
用一组任意的存储单元存储数据元素(可能连续也可能不连续),数据元素之间的逻辑关系
用指针来表示(用指针存放后继元素的存储地址)
c/c++使用指针来实现链式存储结构
-
索引存储结构
在存储节点信息的同时,还建立附加索引
索引表中的每一项称为一个索引项,
索引项的一般形式是:(关键字,地址)
关键字是能唯一标识一个结点的那些数据项。 -
散列存储结构
根据结点的关键字直接计算出该结点的存储地址。
1.2.2 数据类型和抽象数据类型
数据类型的作用:
- 约束变量或常量的取值范围
- 约束变量或常量的操作。
数据类型(Data Type) = 值得集合 + 值集合上的一组操作
抽象数据类型(Abstract Data Type ADT ):
是一个数学模型以及定义在此数学模型上的一组操作
一个抽象数据类型的定义格式如下:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}
1.3 算法和算法分析
算法特性:一个算法必须具备以下五个重要特性
- 有穷性
- 确定性
- 可行性
- 输入 一个算法有零个或多个输入
- 输出 一个算法有一个或多个输出
算法设计的要求
- 正确性 程序对于精心选择的、典型的、苛刻且带有刁难性的几组输入数据能得出满足要求的结果
- 可读性
- 健壮性 当输入非法数据时,算法能恰当做出反应或进行相应处理,而不是产生莫名其妙的输出结果
- 高效性 运行时间尽量少,存储尽可能小
算法效率
一个好的算法满足了正确性、健壮性、可读性这几个方面后,主要考虑算法的效率
算法的效率从以下两个方面考虑:
- 时间效率 值算法耗费的时间
- 空间效率 指的是算法执行过程中所耗费的存储空间
时间效率和空间效率有时候是矛盾的
算法运行时间分析
我们可假设执行每条语句所需的时间均为单位时间,此时对算法的运行时间的讨论就可转化为讨论该算法中所有语句的执行次数,即频度之和了。
算法的渐进时间复杂度(O是数量级的符号),是算出来的表示语句执行频度的数量级,简称时间复杂度
算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:T(n)=O(f(n)),它表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相同,称渐近时间复杂度。
- 最坏时间复杂度:指最坏情况下,算法的时间复杂度
- 平均时间复杂度:指在所有可能输入实例再等概率出现的情况下,算法的期望运行时间
- 最好时间复杂度:指在最好情况下,算法的时间复杂度
- 一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。
对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大O加法法则和乘法法则,计算算法的时间复杂度:
- 加法法则
T(n)=T1(n) + T2(n)= O(f(n)) + O(g(n))= O(max(f(n),g(n))) - 乘法法则
T(n)= T1(n) × T2(n) =O(f(n)) × O(g(n))= O(f(n) x g(n))
常数价 < 对数阶 < 线性价 < 线性对数阶 < 平方阶 < 立方阶 < K次方阶 < 指数阶
渐进空间复杂度
空间复杂度:算法所需存储空间的度量,
记作:S(n)= O(f(n))
其中n为问题的规模(或大小)
算法要占据的空间:
- 算法本身要占据的空间,输入/输出,指令,常数变量等
- 算法要使用的辅助空间