概念
数据结构
数据
data 数据是客观事物的符号表示
- 数据元素(data element):数据元素是数据的基本单位,简称元素
- 复合数据元素:学生基本信息表,一行看成一个数据元素,记录, 学生(姓名,性别,籍贯,专业)
- 数据项(data item):组成数据元素的、有独立含义的不可分割的最小单位,如学生基本信息表, 学生(姓名,性别,籍贯,专业)中的姓名
- 数据对象:性质相同的数据元素的集合,整数数据对象
- 数据结构:相互之间存在一种或多种特定关系的数据元素的集合(结构的含义,数据元素之间存在的关系)
三要素
- 逻辑结构(数据元素+ 关系)
- 集合结构:所有数据元素属于同一个集合
- 线性结构(一对一):除了开头和结尾,其他节点都一个直接前驱和直接后继
- 树形结构(一对多):除了最上面的根结点和最下面的叶子节点,其他结点都有一个直接前驱和多个直接后继
- 图结构(多对多): 数据的逻辑结构是独立于计算机的,可以把他看作是从具体问题抽象出来的数据模型,逻辑结构并不关心这些结构中的数据元素是如何存储在计算机主存中的
- 存储结构:(数据对象的所有元素+元素之间的关系)
- 顺序存储结构:借助元素在存储器中的相对位置来标志数据元素之间的逻辑结构数组
- 链式存储结构 逻辑结构和存储机构相同就是同一个数据结构吗?
不是,还需要数据的运算相同,比如,线性表,栈,队列
- 线性表:允许在两端操作线性表
- 栈:只能允许在一段操作线性表
- 队列:允许一段删除元素,另一端插入元素
- 数据的运算(相关操作)
抽象数据类型
- 数据结构的声明(逻辑结构,相关操作声明)
- 数据结构的实现(存储结构,相关操作的实现)
API:程序编程结构(Application program interface) 提高代码的可扩展性
ADT(abstract data struct)
- 数据结构的实现(存储结构,相关操作实现)
算法(Algorithm)
算法就是为了解决某类问题而规定的一个有限长的操作序列,数据结构的每个基本操作都是一个算法,算法解决基于数据结构之上的问题
算法是研究数据结构的重要途径
特点
- 有穷性:一个算法必须总是在执行有穷步后结束
- 确定性:对于每种情况下所应执行的操作,在算法中都有明确的规定,不会产生二义性
- 可行性:算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现
- 输入:一个算法有零个或者多个输入
- 输出:返回值,参数中的指针
评价算法
- 正确性
- 可读性
- 健壮性:不合理的数据
- 高效性:
- 时间
- 空间
时间复杂度
表示随着问题规模n的增大,算法执行时间的增长率(增长趋势)用T(n)表示,
计算算法所有语句执行总次数 O O是一个渐进符号
数量级(Order of Magnitude)
算法导论中定义 对于给定函数g(n),用O(g(n))表示一个函数集合
O(g(n))={f(n):存在正常量c和,使得对所有,有
O记号为函数给出一个在常量因子内的渐进上界,n趋向于无穷大时,函数的增长趋势
问题规模n
问题规模是算法求解问题输入量是多少,整数n表示
语句频度
一条语句的重复执行次数
基本语句
之算法中重复次数最多的语句,对算法运行时间贡献最大
- 平方阶
- 线性阶
- 立方阶
- 对数阶
- 常量阶
加法法则
总的时间复杂度是所有代码段时间复杂度之后
求最大时间复杂度
- O(1)+O(N)+O(N^2)=O(1+N+N^2)=O(N^2)
- O(1)+O(N)+O(m)=O(N+M)=O(max(N,M))
乘法法则
嵌套循环:嵌套内外代码复杂度的乘积
O(N)* O(N)=O(N^2)
注意:实际做题中,不用考虑是加法还是乘法,主要就是看for循环的次数,要具体代码具体分析
最好、最差以及平均时间复杂度
主要在查找算法中,概率乘以次数(在查找算法中大量训练)
空间复杂度
算法的存储空间与问题规模n之间的增长关系,实际就是辅助存储空间和问题规模N
存储空间:
- 指令(占用存储空间不变)
- 数据
- 输入数据
- 临时数据(辅助存储空间)
O(1):辅助存储空间和问题规模无关(原地工作算法)
其他需要注意的知识点
特殊线性表
栈,队列
字符串:每个数据元素是一个字符 二维数组:每个数据元素是一个线性表