绪论
基本概念和术语
- 数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
- 有时,一个数据元素可由若干个数据项(data item)组成。数据项是数据的不可分割的最小单位。
- 例如,一本书的书目信息为一个数据元素,而书目信息中的每一项(如书名、作者名等)为一个数据项
- 数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。
- 数据结构的形式定义为:数据结构是一个二元组
- Data Structure = (D,S),其中:D是数据元素的有限集,S是D上关系的有限集。
- 逻辑结构:描述的是数据元素之间的逻辑关系
- 线性
- 树形
- 网状/图
- 集合
- 存储结构
- 顺序存储结构
- 链式存储结构
- 任何一个算法的设计取决于选定的数据(逻辑)结构,而算法的实现依赖于采用的存储结构。
- 数据结构的形式定义为:数据结构是一个二元组
- 数据类型(data type)是一个
值的集合
和定义在这个值集上的一组操作
的总称。- 例如,C语言中的整型变量,其值集为某个区间上的整数(区间大小依赖于不同的机器),定义在其上的操作为加、减、乘、除和取模等算术运算。
- 非结构的原子类型。原子类型的值是不可分解的,例如C语言中的基本类型(整型、实型、字符型和枚举类型)、指针类型和空类型。
- 结构类型。结构类型的值是由若干成分按某种结构组成的,因此是可以分解的,并且它的成分可以是非结构的,也可以是结构的。
- 抽象数据类型(Abstract Data Type,简称ADT)是指一个数学模型以及定义在该模型上的一组操作。
- 给出抽象而非具体实现
- 和数据结构的形式定义相对应,抽象数据类型可用以下三元组表示
- (D,s,P)其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。
算法与算法分析
- 特性:
- 有穷:能在有穷步有穷时间内完成,便于分析效率,操作系统这种就不算,你可以把它一直开着,这叫程序
- 确定性:不产生歧义,且对相同输入结果唯一
- 可行性
- 输入
- 输出
- 好算法的要求
- 正确性:满足问题的需求,通常以程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果为标准
- 可读性:人能看懂,要用流程图能说明白
- 健壮性:输入非法也能做出适当反应
- 效率与低存储量需求:都与问题规模有关
- 算法效率度量
- 事后统计
- 事前估算
- 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作T(n)= O(f(n)),它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称做算法的渐近时间复杂度(asymptotic time complexity),简称时间复杂度。
- 大O表示法中的f(n)是T(n)的上界,即在某个数后,f(n)总大于等于T(n)
- 小o表示法也是上界,只是没有等号
- 大Ω表示法是表示下界
- 小ω表示法也是下界,没有等号
- 等于还可以表示为Θ(p(n))
- 时间复杂度的估算方法
- 找一个基本的操作,一般在最内层循环里面某个操作,计算这个操作进行的次数
- 找一个基本的操作,一般在最内层循环里面某个操作,计算这个操作进行的次数
- 常用渐进函数
- 算法的渐进时间复杂度考虑的只是对于问题规模的增长率,在难以精确计算基本操作语句执行次数的情况下,只需求出它关于n的增长率或数量级即可。
- 算法的时间复杂度通常以算法中关键操作重复执行的次数作为度量标准
- 被视作算法基本操作的一般是最深层循环内的语句。—— 算法的时间复杂度是由嵌套最深层语句的频度(该语句重复执行的次数)决定的
- 这种衡量效率的办法所得出的不是时间量,而是一种增长趋势的量度。它与软硬件环境无关,只暴露算法本身执行效率的优劣
- 在实时系统,关注最差情况。在其他情况,通常考虑平均情况,只要知道计算平均情况所需的输入数据的分部即可。否则,只能求助最差的情况分析
- 练习
- 空间复杂度
- 指令常数变量所占用的存储空间;
- 输入数据所占用的存储空间;
- 辅助(存储)空间。
- 一般地,算法的空间复杂度指的是辅助空间。
- 一维数组a[n]: 空间复杂度 O(n)
- 二维数组a[n][m]: 空间复杂度 O(n*m)
- 若所需额外空间相对于输入数据量来说是常数,则称此算法为原地工作