Python数据结构与算法(一)
- 时间复杂度
- 代码运行效率计算
- 时间复杂度
- O(1)
- O(N)
- O(logN)
- O(M+N)
- O(MlogN)
- O( N 2 N^2 N2)
- 时间复杂度对比
时间复杂度
代码运行效率计算
时间复杂度是指算法的执行效率。当我们在运行一段代码的时候可以在代码区前使用time模块,可以对代码区代码运行效率进行计算。
import time
def test(num:int):
total = 0
for i in range(num):
total += i
return total
start_time = time.time()
# 代码区
test(1000)
end_time = time.time()
run_time = end_time - start_time
print('运行时间为%s秒' % (run_time))
多次运行同样的代码,会发现运行时间并不是固定的。这是因为代码的运行速度并不是客观准确的!程序的运行离不开计算机的环境(包括硬件和操作系统),这些客观原因都会影响程序运行速度并反应在程序的执行时间上。那么如何客观的评价一个算法的优劣呢?
时间复杂度
这时,我们引入时间复杂度的概念,时间复杂度是指算法的执行时间与算法输入值之间的关系。
时间复杂度一般关注与对代码运行效率影响最大的代码区内的执行指令数。
N表示数据的规模,O(f(N))表示运行算法所需要执行的指令数,和f(N)成正比。
O(1)
如果函数之中算法执行时间与输入值是没有关系的,那么这个算法的时间复杂度为O(1):
def fun(num:int):
i = num
j = num * 2
return i + j
O(N)
时间复杂度为O(N)的情况:
def fun(num:int):
total = 0
for i in range(num):
total += 1
return total
这里不看常量total常量,这个算法中循环内从0到num,这个num有N个,所以这个算法时间复杂度为O(N)。
O(logN)
时间复杂度为O(logN)的情况:
def fun(num:int):
i = 1
while i < num:
i = i * 2
return i
这里我们不看常量i,这个算法中while循环停止条件为i小于num(也就是N),循环体内部i每次为上一次的2倍,相当与while循环循环次。如果循环体内部为i += i * 3,那么时间复杂度也为O(
)。
O(M+N)
def fun(num1:int, num2:int):
total = 0
for i in range(num1):
total += i
for j in range(num2):
total += j
return total
在这个算法中,有两个for循环并列,所以算法的时间复杂度为O(M+N)。
O(MlogN)
def fun(num1:int, num2:int):
total = 0
j = 0
for i in range(num1):
while j < num2:
total += i + j
j = j * 2
return total
当发生循环嵌套时,时间复杂度为乘法的关系,所以该算法时间复杂度O(MlogN)。
O(
)
def fun(num:int):
total = 0
for i in range(num):
for j in range(num):
total += i + j
return total
两个循环嵌套,时间复杂度为乘法的关系,所以该算法时间复杂度O()。
时间复杂度对比
O(1) < O(logN) < O(N) < O(MlogN) < O() < O(
)< O(
) < O(
) < O(
)
在写算法时,对算法优化就算看是否能将时间复杂度降低的过程。