时间复杂度和空间复杂度(完)
学习视频地址:https://www.bilibili.com/video/BV1uA411N7c5
内容概要
一、时间复杂度
二、空间复杂度(了解)
三、时间复杂度判断
四、一些特殊的时间复杂度
1、时间复杂度
**个人理解**
时间复杂度是一个计量单位,就像毫米、厘米、分米、米等单位,它更接近数量级。
它用于描述一段代码执行时间的快慢等级,并不具体的反应一段代码的执行时间。时间复杂度越高,算法的执行效率越低。
对于一个普通的代码语句
print("hello world")
它的时间复杂度是O(1)
print("hello,world") print("hello,world") print("hello,world")
同样的,对于三条重复的普通语句,它的时间复杂度不是O(3),同样是O(1)
因为3条打印语句和1条打印语句的具体执行时间相差并不大,就像3毫米和1毫米相差不大,这个差值可以忽略不计。
当这个普通语句重复n遍时,它的复杂度变为O(n)
例如:
for i in range(n): print("hello world")
当一个普通语句重复n遍时,与普通语句执行1次或者3次的相差很大,差值不能忽略
就像1毫米和1米一样,将O(1)与O(n)视为不同单位会更好理解
当再多一层循环时,例如
for i in range(n): for j in range(n): print("hello world")
它的时间复杂度为O(n**2)
2、空间复杂度(了解)
与时间复杂度类似,空间复杂度是描述一段代码消耗内存的多少的等级。
import random li = [random.randrange(0,10) for _ in range(0,101)] new_li = [] # 开辟了一个新的列表,它的长度为原列表的长度100 for i in li: new_li.append(i)
对于这段代码,由于申请了一个与原列表长度一样(都为100,可以不完全一样,只要近似100也可以)的列表的空间,所以它的空间复杂度为O(n)
对于空间复杂度不需要太过注意,在内存允许情况下,一般都追求用空间换时间
3、时间复杂度判断
print("hello world") print("hello world") print("hello world") print("hello world")
注意:对于这段代码,它的时间复杂度不是O(4),而是O(1)
for i in range(n): print("hello world") for i in range(n): print("hello world")
同样:对于这段代码,它的时间复杂度不是O(2n), 而是O(n)
还是那句话,它用于描述一段代码执行时间的快慢等级,并不具体的反应一段代码的执行时间。
**个人理解**
之所以这样判断,是从它的功能来的,描述一段代码执行时间的快慢等级,不同等级之间的执行效率相差是很大的
比如O(1)与O(n),O(n)耗时是O(1)的n倍
O(n)与(n**2),O(n**2)耗时是O(n)的n倍
在计算复杂算法的时间复杂度时,很难精确的计算出它含有常量级的时间复杂度,所以一般把常量舍去,比如O(1)和O(4)差别不大,所以统一使用O(1)表示
在优化算法时,也没有必要费尽心思将复杂度为O(n+1)的算法优化为O(n),因为它们差别不大,但如果是举手之劳就另说了
4、一些特殊的时间复杂度
记忆:存在对半平分的算法或查找方法,一般都存在O(logn)的时间复杂度(logn是以2为底,以n为真数的对数)
比如:二分法查找数据
def half_select(li, head_index, tail_index, find_num, find_nun): mid_index = (head_index + tail_index) // 2 mid_value = li[mid_index] while mid_value != find_nun: if head_index == tail_index: return (False, None) if find_num > mid_value: head_index = mid_index + 1 elif find_num < mid_value: tail_index = mid_index - 1 mid_index = (head_index + tail_index) // 2 mid_value = li[mid_index] else: return (True, mid_index)
它的时间复杂度就为logn
其它一些常见的时间复杂度
O(nlogn)、O(n**2logn)
常见时间复杂度的效率排序
O(1) < O(logn) < O(n) < O(nlogn) < O(n**2)
其它一些复杂的时间复杂度
O(n!) n的阶层;O(2**n); O(n**n)
***完***
本文来自博客园,作者:口乞厂几,转载请注明原文链接:https://www.cnblogs.com/laijianwei/p/14594591.html

浙公网安备 33010602011771号