算法
算法是解决问题的方法和思想。
算法复杂度
对于算法的时间性质和空间性质,最重要的是其数量级和趋势.可以认为
3n2
3
n
2
和
1000n2
1000
n
2
,都是
n2
n
2
级
算法完成工作最少需要多少基本操作,即最优时间复杂度
算法完成工作最多需要多少基本操作,即最坏时间复杂度
无特殊说明时,算法的时间复杂度都是指最坏时间复杂度
基本操作,即只有常数项,认为其时间复杂度为O(1)
顺序结构,时间复杂度按加法进行计算
循环结构,时间复杂度按乘法进行计算
分支结构,时间复杂度取最大值
例子
如果 a+b+c=1000,且
a2+b2=c2
a
2
+
b
2
=
c
2
(a,b,c 为自然数),求abc所有可能组合
算法1:
for a in range(0, 1001): # 执行n次
for b in range(0, 1001): # 执行n次
for c in range(0, 1001): # 执行 n次
if a**2 + b**2 == c**2 and a+b+c == 1000:
print("a, b, c: %d, %d, %d" % (a, b, c))
算法复杂度为 T(n)=O(n∗n∗n)=O(n3) T ( n ) = O ( n ∗ n ∗ n ) = O ( n 3 )
算法2:
for a in range(0, 1001): # 执行n次
for b in range(0, 1001): # 执行n次
c = 1000 - a - b
if a**2 + b**2 == c**2:
print("a, b, c: %d, %d, %d" % (a, b, c))
算法复杂度为 T(n)=O(n∗n∗(1+1))=O(n2) T ( n ) = O ( n ∗ n ∗ ( 1 + 1 ) ) = O ( n 2 )
import matplotlib.pyplot as plt
from math import log
n=11
x = [i for i in range(1,n)]
O1 = [1 for i in range(1,n)]
Ologn = [log(i,2) for i in range(1,n)]
On = [i for i in range(1,n)]
Onlogn = [i*log(i,2) for i in range(1,n)]
On2 = [i*i for i in range(1,n)]
On3 = [i*i*i for i in range(1,n)]
plt.plot(x,O1,label="1")
plt.plot(x,Ologn,label="logn")
plt.plot(x,On,label="n")
plt.plot(x,Onlogn,label="nlogn")
plt.plot(x,On2,label="n^2")
plt.plot(x,On3,label="n^3")
plt.legend()
数据结构
在python中list和dict都是一种数据结构.在list查询一个值需要的时间复杂度是O(n),而在dict里查询一个值的时间复杂则为O(1).
数据存储方式不同会导致需要不同的算法进行处理,我们希望算法解决问题的效率越快越好,玉石就要研究数据应该如何保存,这就是数据结构