数据结构的基本概念
数据结构可以分为 逻辑结构和 物理结构
逻辑结构:
- 集合结构 :元素之间是相等关系
- 线性结构 :元素之间一对一关系
- 树形结构 : 元素之间一对多关系
- 图形结构 :元素之间多对多关系
物理结构:是指数据在计算机的存储形式
- 顺序存储;
- 链式存储: 通过该地址就可以找到相关的数据元素的位置;
算法分析
时间复杂度的概念
程序执行的总时间 = 程序总的执行步骤 * 每一步执行的时间
例如:
for a in range(1001): # 1000次
for b in range(1001): # 1000次
c = 1000 - a -b # 3次
li = []
li.append(c)
程序执行的总时间: 1000 * 1000 * 3 = 1000^2 *3 如果是n次则
抽象: n^2 * 3
渐进函数表示: n^2
大O表示法: O(N^2)
大O表示法
对于算法进行特别具体的细致分析虽然很好,但在实践中的实际价值有限。对于算法的时间性质和空间性质,最重要的是其数量级和趋势,这些是分析算法效率的主要部分。而计量算法基本操作数量的规模函数中那些常量因子可以忽略不计。例如,可以认为3n2和100n2属于同一个量级,如果两个算法处理同样规模实例的代价分别为这两个函数,就认为它们的效率“差不多”,都为n2级。
大O表示法的几条基本计算规则
基本操作: 即只有常熟项,认为其时间复杂度为O(1)
顺序结构: 时间复杂度按加法进行计算
循环结构: 时间复杂度按乘法进行计算
分支结构: 时间复杂度取最大值
最坏时间复杂度
分析算法时,存在几种可能的考虑:
- 算法完成工作最少需要多少基本操作,即最优时间复杂度
- 算法完成工作最多需要多少基本操作,即最坏时间复杂度
- 算法完成工作平均需要多少基本操作,即平均时间复杂度
主要关注算法的最坏情况,亦即最坏时间复杂度。
常见的时间复杂度
执行次数函数举例 | 阶 | 非正式术语 |
---|---|---|
12 | O(1) | 常数阶 |
2n+3 | O(n) | 线性阶 |
3n2+2n+1 | O(n2) | 平方阶 |
5log2n+20 | O(logn) | 对数阶 |
2n+3nlog2n+19 | O(nlogn) | nlogn阶 |
6n3+2n2+3n+4 | O(n3) | 立方阶 |
2n | O(2n) | 指数阶 |
注意,经常将log2n(以2为底的对数)简写成logn
消耗时间的大小关系
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
空间复杂度
类似于时间复杂度的讨论,一个算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。
渐近空间复杂度也常常简称为空间复杂度。
空间复杂度(SpaceComplexity)是对一个算法在运行过程中临时占用存储空间大小的量度。
算法的时间复杂度和空间复杂度合称为算法的复杂度。