引入类比相关问题:
问题 大约花费时间
眨一下眼 不到一秒/瞬间
口算“123+34” 几秒
烧一壶水 几分钟
睡一觉 几个小时
完成一个项目 几天/几个星期/j几个月
飞船从地球飞出太阳系 几年
时间复杂度基本概念:
时间复杂度是用来估计算法运行时间的一个例子(单位) 利用大O渐近法
一般来说,时间复杂度越高(越复杂),算法的效率越慢。
常见的复杂度(按照效率依次排序)
->O(1)<O(lgn)<O(n)<O(nlgn)<O(n^2)<O(n^2lgn)<O(n^3)
复杂问题的时间复杂度一般有:O(n!)、O(2^n)、O(n^n)...
O:在数学中表示一个数值的上限,我们可以理解为“大概,大约”
1、n、n^2...:表示一种单位,算法复杂程度
判断一些简单的时间复杂度:
print('Hello World')
print('Hello Python')
print('Hello Algorihm')
时间复杂度为:O(1) 类似于这种执行打印的代码
for i in range(n):
print('hello world')
for j in range(n):
print('hello world')
时间复杂度为:O(n^2) 类似于循环嵌套n层时间复杂度就是O(n^n)
引入一个比较重要的时间复杂度(O(logn))
代码演示:
n=int(input('请输入n的值:'))
while n>1:
print(n)
n=n//2
输出结果:
可见:每执行一次循环语句n的值折板(规模减少一半)
2^6=64 循环一共执行6次
log2 64=6
则:时间复杂度记为O(log2n)或者O(logn)
识别技巧:当算法过程中出现循环折半时,复杂式中会出现logn
如何快速判断算法的时间复杂度:
(适用于绝大多数情况)
确定问题规模 n
循环减半过程 logn
k层循环 n^k
复杂情况:根据算法执行过程判断
引入类比相关问题:
我们都知道,我们在创建一个变量的时候,计算机会为它开辟内存空间。
所以,空间复杂度可以大致理解为,对应内存使用的一个量度。
概念:
空间复杂度:用来评估算法内存占用大小的式子
它与时间复杂度的表示方法一样 采用 大O渐进法
例如常见的判断:
算法使用了几个变量:O(1)
算法使用了长度为n的列表:O(n)
算法使用了m行n列的二维数组:O(mn)
*“空间换时间” 现在的计算机对于内存的使用已经不在关注,内存容易造。
场景:在一个软件中,为了让用户减少等待时间,这时就要考虑“空间换时间”
总结:
编程思想:
程序=算法+数据结构
算法是什么?
可以理解为解决实际问题的办法
数据结构是什么?
可以理解为解决数据存储的问题,用什么数据类型来存储 (比如Python中的列表、元组、字典、集合、数组......)
时间复杂度和空间复杂度是用来衡量算法的优良,执行的效率(与硬件设备...无关)。
一般来讲,时间复杂度占绝大比例,“空间换时间”(内存够大且容易获取)。
这两种复杂度都是一种估计,大约的感觉。