目录
前言
主要介绍数据结构的一些基本概念和算法时间复杂度和空间复杂度的计算
数据结构的基本概念
数据
数据是信息的载体, 是描述客观事物属性的数、字符及所有能所有输入到计算机中并且能够被计算机识别和处理的符号集合。
数据元素、数据项
数据元素是数据的基本单位,通常作为一个整体考虑和处理
一个数据元素由若干数据项构成,数据项是数据元素不可分割的最小单位
数据对象、数据结构
数据对象是具有相同性质的数据元素的集合,是数据的一个子集
数据结构是相互之间存在一种或多种特定关系数据元素的集合,强调的是数据元素相互之间的关系
数据结构的三要素
1.逻辑结构
可以分为:集合结构,线性结构,树状结构,图状结构
线性结构:一对一
树状结构:一对多
图状结构:多对多
2.数据的运算
得结合逻辑结构和实际需求来定义基本运算
基本操作是增销 改查
3.物理结构(存储方式)
常见的有四种存储结构:顺序存储,链式存储,索引存储,散列存储(哈希存储)
什么是算法?
算法是对特定问题的步骤的一种描述,是指令的有限序列。
算法的特性
1.有穷性 2.确定性 3.可行性 4.输入 5.输出
'好 '算法的特质
1.正确性 2.可读性 3.健壮性 4.高效率和低存储需求
算法时间复杂度
事前预估算法时间开销T(n)与问题规模n的关系,T=T(n)
当问题规模足够大时即n足够大时,T(n)可以用O(n)来表示,大O表示“同阶”,同等数量级。即当:n->无穷时,二者之比为常数。
计算方法
a)加法规则
T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n))) 多项相加,只保留最高阶项,且系数变为1
b)乘法规则
T(n)=T1(n) * T2(n)=O(f(n)) * O(g(n))=O(f(n)*g(n)) 多项相乘,都保留
比较大小的结论
O(1)<O(log2 n)<O(n)<O(nlog 2 n)<O(n的2次方)<O(n的3次方)<O(2的n次方)<O(n!)<O(n的n次方)
口诀记忆:常对幂指阶
在代码中如何分析时间复杂度,如何计算
主要看循环部分的语句,执行多少次
结论1:顺序执行的代码只会影响常数项,可以忽略。
结论2:只需要挑循环中的一个基本操作分析它与执行次数与n的关系即可
结论3: 如果有多层嵌套循环,只需要关注最深层的循环循环了多少次
对于得出结果时间不同,有三种时间复杂度
最坏时间复杂度:在最坏情况下算法的时间复杂度
平均时间复杂度:所有输入示例等概率出现的情况下,算法的期望运行时间
最好时间复杂度:在最好情况下算法的时间复杂度,一般不会参考这个
算法空间复杂度
空间开销(内存开销)S 与问题规模n之间的关系 ,可以用数量级O来表示
只需要关注存储空间大小与问题规模相关的变量,比如开辟一个数组,与n有关
计算方法
a)加法规则
S(n)=S1(n)+S2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n))) 多项相加,只保留最高阶项,且系数变为1
b)乘法规则
S(n)=S1(n) * S2(n)=O(f(n)) * O(g(n))=O(f(n)*g(n)) 多项相乘,都保留
比较大小的结论
O(1)<O(log2 n)<O(n)<O(nlog 2 n)<O(n的2次方)<O(n的3次方)<O(2的n次方)<O(n!)<O(n的n次方)
口诀记忆:常对幂指阶
函数递归调用带来的内存开销
空间复杂度=递归调用的深度
后续还会继续更新关于数据结构的内容