0 一些定义
- 什么是数据结构:存储、组织数据的方式
- 什么是算法:为了满足业务需求、实现业务目的的各种方法和思路
- 程序=算法+数据结构
1 算法
- 算法的特性:
- 独立性:独立于编程语言Python
- 五大特性:
- 有输入:>=0
- 有输出:>0
- 有穷性:执行有限步
- 可行性:每一步都能执行
- 确定性:每一步都有确定的意义
1.1 时间复杂度
- 时间复杂度表示一个算法随着问题规模不断变化的最主要趋势。
- 时间效率:算法的总执行步数。
- 时间复杂度T(n):时间效率中主趋势O()
1.1.1 时间复杂度的计算规则
- 基本操作:时间复杂度为O(1)
- 顺序结构:时间复杂度按加法进行计算
- 循环结构:时间复杂度按乘法进行计算
- 分支结构:时间复杂度取最大值
- 判断一个算法的效率时,只需要关注操作数量的最高次项,其他次要项和常数项可以忽略
- 没有特殊说明,时间复杂度指最坏时间复杂度
# 时间复杂度为O(1)
def f():
a=100
b=200
c=a+b
# 时间复杂度为O(n)
def f(n):
for i in range(0,n):
print(i)
# 时间复杂度为O(n),而不是O(2n)
def f(n):
for j in range(0,2):
for i in range(0,n):
print(i)
1.1.2 最优最坏时间复杂度
- 最优时间复杂度:最少需要多少基本操作。反映最乐观理想的情况,无参考价值。
- 最坏时间复杂度:最多需要多少基本操作。主要关注的情况。
- 平均时间复杂度:平均需要多少基本操作。
1.1.3 常见时间复杂度
-
o(1) :基本操作
-
o(logn): 一层循环,二分法
-
o(n): 一层循环
-
o(nlogn) 一层循环+二分法
-
o(n2):二层循环
-
o(n3):三层循环
执行次数函数举例 | 阶 | 非正式术语 |
---|---|---|
12 | O(1) | 常数阶 |
2n+3 | O(n) | 线性阶 |
3n2+2n+1 | O(n2) | 平方阶 |
5log2n+20 | O(logn) | 对数阶 |
6n3+2n2+3n+4 | O(n3) | 立方阶 |
# 时间复杂度为O(log n)
def func(n):
i=1
while i<n:
i*=2
print(i)
1.2 空间复杂度
算法在运行过程中临时占用存储空间的大小的度量S(n)。
常见的空间复杂度:
-
o(1) : 常量
-
o(logn): list 二分法
-
o(n): list
-
o(nlogn)
-
o(n2): 矩阵
-
o(n3): 三维数据
1.2.1 常数阶O(1)
普通常量、变量、对象、元素数量与输入数据大小N无关的集合
# 空间复杂度为O(1)
for i in range(n):
a=i
print(a)
1.2.2 线性阶O(n)
元素数量与n呈线性关系的任一类型集合(一维数组、链表等),均使用线性大小的空间。
# 空间复杂度为O(n)
list1=[]
for i in range(n):
list1.append(i)
1.2.3 平方阶O(n2)
元素数量与n呈平方关系的任一类型集合(矩阵),使用平方大小的空间。
# 以下代码循环了n次,但是使用的临时空间list1会随n的变化进行平方增长,空间复杂度为O(n2)
list1=[]
for i in range(n):
list2=[]
for j in range(n):
list2.append(j)
list1.append(list2)
2 数据结构
- 数据结构式:存储、组织数据的方式。
- 想通的数据采用不同数据结构的存储,带来的运行或存储效率是不同的
- 算法是为了解决实际问题设计的,数据结构是算法需要处理的问题的载体。