时间复杂度
定义:衡量代码运行时间的数据,一般用O来表示。
下面用代码来说明如何来观察时间复杂度。
>>> print('hello world')
#只打印了一次hello world,称做O(1)
>>> for i in rang(n):
print('hello world')
#一个循环,打印了n次hello world,称做O(n)
>>>for i in rang(n):
for j in rang(n):
print('hello world')
#两个循环嵌套,打印了n次hello world,称做O(n^2)
>>> for i in rang(n):
for j in rang(n):
for k in rang(n):
print('hello world')
#两个循环嵌套,打印了n次hello world,称做O(n^3)
通过上面的例子可以明白我们在利用循环的次数来判断衡量O。
第一个例子没有循环,但是没有被写为0,是因为可以把这种情况当作单位1来理解,1不只是次数,而是一个单位。
>>>i=n
while i>0:
print("hello world")
i=i//2
例如这种,如果每次循环都除二,那么复杂度该怎么判断呢?
那么利用数学公式,循环次数即为log以2为底的n的对数。 将其简化,我们叫它的复杂度为O(logn)。
举一反三。
>>>print('hello')
print('world')
print('1')
>>>for i in range(n)
print('hello')
for j in range(n)
print('world')
第一种由于没有循环,所以可以看做只有O(1),第二种,一层循环里套着一层循环,是不是要看做O(n+n^2)呢?
事实上,这是不用的。因为n^2远大于n,此时n可以被忽略,则第二种实际上的复杂度为O(n^2)。
所以利用循环来判断判断时间复杂度仅仅只是一个技巧。而不是方法。
判断时间复杂度的技巧
1.判断问题的规模n
2.判断循环,减半O(logn),嵌套K次O(n^K)
3.复杂情况根据执行状况来判断。
空间复杂度
定义:判断代码所占内存。
判断方法:代码包含几个变量。
1)几个(具体数量)复杂度为O(1)
2)列表长度为nO(n)
3)列表n行m列O(mn)
另外,我们常采取牺牲空间复杂度的办法来提交高效率,减少时间复杂度。