一、前言
引入:如果a+b+c=1000,且a^2+b^2=c^2(a,b,c为自然数),如何求出所有a、b、c可能的组合?
枚举法:abc从0开始,ab为0,c从0-1000依次试验,然后将b改为1,c从0-1000依次试验
import time # 导入time包
start_time = time.time() # 记录开始时间
for a in range(0,1001): # 遍历a从0-1000
for b in range(0,1001): #遍历b从0-1000
for c in range(0,1001): #遍历c从0-1000
if a+b+c ==1000 and a**2+b**2 == c**2:
print("a,b,c:%d,%d,%d" %(a,b,c))
end_time = time.time() # 记录结束时间
print("time:%d" %(end_time-start_time)) # 计算运行花费时间
print("finished") # 运行结束
import time # 导入time包
start_time = time.time() # 记录开始时间
for a in range(0,1001): # 遍历a从0-1000
for b in range(0,1001): #遍历b从0-1000
c = 1000-a-b
if a**2+b**2 == c**2:
print("a,b,c:%d,%d,%d" %(a,b,c))
end_time = time.time() # 记录结束时间
print("time:%d" %(end_time-start_time)) # 计算运行花费时间
print("finished") # 运行结束

算法:计算机程序本质上是一个算法告诉计算机确切的步骤来执行一个指定的任务
算法的五大特性:
1.输入:算法具有0个或多个输入
2.输出:算法至少有1个或多个输出
3.有穷性:算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
4.确定性:算法中每一步都有确定的含义,不会出现二义性
5.可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成
算法效率衡量:执行时间反映算法效率(时间也与当前环境相关)
每台机器执行的总时间不同,但是执行的基本运算数量大体相同
时间复杂度:对于同一类问题,所花费的步骤有一个统一的表示,
大O表示法:将常数K等细节省去,只留下主要特征部分,进行时间表示
最优时间复杂度:算法完成工作最少需要多少基本操作
最坏时间复杂度:算法完成工作最多需要多少基本操作
平均时间复杂度:算法完成工作平均需要多少基本操作
时间复杂度的几条基本计算规则
1. 基本操作,即只有常数项,认为其时间复杂度为O(1)
2. 顺序结构,时间复杂度按加法进行计算
3. 循环结构,时间复杂度按乘法进行计算
4. 分支结构,时间复杂度取最大值
5. 判断一个算法效率时,往往只需关注操作数量的最高次项,其他次要项和常数项可忽略
6. 在没有特殊说明时,我们所分析的时间复杂度指最坏时间复杂度
常见时间复杂度与大小关系
| 执行次数函数举例 | 阶 | 非正式术语 |
| 12 | O(1) | 常数阶 |
| 2n+3 | O(n) | 线性阶 |
| 2n2+3n+1 | O(n2) | 平方阶 |
| 5log2n+11 | O(logn) | 对数阶 |
| 2n+snlog2n+1 | O(nlogn) | nlogn阶 |
| 6n3+3n2+2n+3 | O(n3) | 立方阶 |
| 3n | O(2n) | 指数阶 |
消耗时间从小到大升序排列
O(1) < O(log2n) < O(n) < O(nlog2n) <O(n2) <O(n3)<O(2n)<O(n!)<O(nn)