基本概念和术语
数据
- 是能输入计算机且能被计算机处理的各种符号的集合。
- 信息的载体
- 是对客观事物符号化的表示
- 能够被计算机识别,存储和加工
- 包括:
1、 数值型的数据:整数、实数等
2、 非数值型的数据:文字、图像、图形、声音等
数据元素
- 是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
- 也简称为元素,或称为记录,结点或顶点。
- 一个数据元素可由若干个数据项组成。
数据项
- 构成数据元素的不可分割的最小单位
三者之间的关系
- 数据>数据元素>数据项
数据对象
- 是性质相同的数据元素的集合,是数据的一个子集
数据元素和数据对象
-
数据元素----组成数据的基本单位
与数据的关系:是集合的个体
-
数据对象----性质相同的数据元素的集合
与数据的关系:集合的子集
数据结构
-
数据元素不是孤立存在的,它们之间存在着某种关系,数据元素相互之间的关系称为结构
-
是指相互之间存在的一种或多种特定关系的数据元素的集合
-
或者说,数据结构是带结构的数据元素的集合
-
包括:
1、数据元素之间的逻辑关系,也称为逻辑结构
2、数据元素及其关系在计算机内存中的表示(又称为映像),称为数据的物理结构或数据的存储结构
3、数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现。
逻辑结构
- 描述数据元素之间的逻辑关系
- 与数据的存储无关,独立于计算机
- 是从具体问题抽象出来的数学模型
物理结构(存储结构)
- 数据元素及其关系在计算机存储器中的结构(存储方式)
- 是数据结构在计算机中的表示
逻辑结构和数据结构之间的关系:
- 存储结构是逻辑关系映象与元素本身的映象
- 逻辑结构是数据结构的抽象,存储结构是数据结构的实现
- 两者综合起来建立了数据元素之间的结构关系
逻辑结构的种类
- 方式一:
线性结构:线性表、栈、队列、串
有且只有一个开始和一个终端结点,并且所有结点都最多只有一个直接前驱和直接后继
非线性结构:数和图
一个结点可能有多个直接前驱和直接后继 - 方式二:四种基本逻辑结构
集合结构:除了同属于一个集合,没有其它关系
线性结构:一对一
树形结构:一对多
图状结构(网状结构):多对多
四种基本能的存储结构
- 顺序存储结构
C语言中用数组来实现 - 链式存储结构
C语言中用指针来实现 - 索引存储结构
- 散列存储结构
数据类型
- 数据类型是一组性质相同的值的集合以及定义于这个集合上的一组操作的总称
- 数据类型=值的集合+值集合上的一组操作
抽象数据类型(ADT)
- 是指一个数学模型以及定义在此数学模型上的一组操作
1、由用户定义,从问题抽象出数据模型(逻辑结构)
2、还包括定义在数据模型上的一组抽象运算(相关操作)
3、不考虑计算机内的具体存储结构与运算的具体实现算法 - 抽象数据类型可用(D,S,P)三元组表示
D:数据对象
S:是D上的关系集
P:是对D的基本操作集 - 抽象类型的定义格式
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
其中基本操作的定义格式为:
基本操作名(参数表)----引用参数以&打头,除了可提供输入值外,还将返回操作结果
初始条件:<初始条件描述>
操作结果:<操作结果描述>
小结:
算法和算法分析
《数据结构与算法》的研究内容
- 逻辑结构:研究对象的特性及其相互之间的关系
- 存储结构:有效的组织计算机存储
- 算法:有效的实现对象之间的“运算”关系
算法的定义
- 对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中,每个指令表示一个或多个操作。
- 简而言之,算法就是解决问题的方法和步骤
算法和程序
- 算法:是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法。
- 程序:是用某种程序设计语言对算法的具体实现
- 程序=算法+数据结构
数据结构通过算法实现操作
算法根据数据结构设计程序
算法特性
- 有穷性
- 确定性
- 可行性
- 输入:0个或多个输入
- 输出:1个或多个输出
算法设计的要求
- 正确性
- 可读性
- 健壮性
- 高效性
算法效率
从以下两方面考虑
- 时间效率:指的是算法所耗费的时间
- 空间效率:指的是算法执行过程中所耗费的存储空间
时间效率和空间效率有时候是矛盾的
算法时间效率的度量
- 算法时间效率可以用依据在该算法编制的程序在计算机上执行所消耗的时间来度量
- 两种度量方法
1、事后统计
将算法时间、测算其时间和空间开销
2、事前分析(一般使用这种)
对算法所消耗资源的一种估算方法
事前算法分析
- 算法运行时间=一个简单操作所需要的时间×简单操作次数
- 算法运行时间=∑每条语句的执行次数(每条语句频度)×该语句执行一次所需要的时间
算法时间复杂度的渐进表示法
- 为了便于比较不同的算法的时间效率,我们仅比较它们的数量级
- 若有某个辅助函数f(n),使得当n趋于无穷大时,F(n)/f(n)的极限值为不等于零的常数。则称f(n)是T(n)的同数量级函数,记作T(n)=O(F(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度
- 一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作执行的次数,它是问题规模n的某个函数,用T(n)表示
- 基本操作简单来说就是执行次数最多的语句
分析算法时间复杂度的基本方法
-
找出语句频度最大的那条语句作为基本语句
-
计算基本语句的频度得到问题规模n的某个函数f(n)
-
取其数量级用符号“O”表示
-
注意:有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同
算法时间复杂度
- 最坏时间复杂度:指在最坏的情况下,算法的时间复杂度
- 平均复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间
- 最好时间复杂度:指在最好情况下,算法的时间复杂度
- 一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。
- 对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大O加法法则和乘法法则,计算算法的时间复杂度
a)加法法则
T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
b)乘法法则
T(n)=T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n)) - 当n取得很大时,指数时间算法和多项式时间算法在所需要时间上非常悬殊
-时间复杂度T(n)按数量级递增顺序为:
长阶数 对阶数 线性阶 线性对数阶 平价阶 立方阶 … K次方阶 指数阶
O(1) O(log2n) O(n) O(nlog2n) O(nn) O(nn*n) O(n的k次方) O(2的n次方)
渐进空间复杂度:
- 空间复杂度
算法所需存储空间的度量
记作:S(n)=O(f(n)),其中n为问题的规模(或大小) - 算法要占据的空间
算法本身要占据的空间,输入、输出,指令,常数,变量等
算法要使用的辅助空间