您的位置:首页 > 理论基础 > 数据结构算法

数据结构(基于python实现)02-算法复杂度分析

2018-03-22 14:47 543 查看
计算机基本的构造模块:数据结构和算法

所以提到数据结构,那么就不得不提算法。而如何评价一个算法的质量呢?

第一个层次就是正确性、第二个层次就是可读性和易维护性、最后就是分析一个算法的复杂度

算法复杂度:1、空间复杂度 2、时间复杂度

1、空间复杂度:

空间复杂度的计算需要计算程序运行所需的资源,一个显著的评价标准就是程序运行时的内存使用量。

2、时间复杂度:

运行一个小程序,用于计算运行时间和内存的对比

import time
import psutil
import os

def problem_size(num):
t_start = time.time()

for i in range(num):
# for j in range(num):
i -= 1

t_stop = time.time()
return t_stop - t_start, psutil.Process(os.getpid()).memory_info().rss

print("num = 100的运行时间%f内存使用%s" % problem_size(100))
print("num = 200的运行时间%f内存使用%s" % problem_size(200))
print("num = 400的运行时间%f内存使用%s" % problem_size(400))
print("num = 1000的运行时间%f内存使用%s" % problem_size(1000))
print("num = 10000的运行时间%f内存使用%s" % problem_size(10000))


结果是:

# num = 100的运行时间0.000006内存使用9379840
# num = 200的运行时间0.000009内存使用9408512
# num = 400的运行时间0.000019内存使用9408512
# num = 1000的运行时间0.000057内存使用9408512
# num = 10000的运行时间0.000603内存使用9408512


如果我再嵌套一层循环呢:

import time
import psutil
import os

def problem_size(num):
t_start = time.time()

for i in range(num):
for j in range(num):
i -= 1

t_stop = time.time()
return t_stop - t_start, psutil.Process(os.getpid()).memory_info().rss

print("num = 100的运行时间%f内存使用%s" % problem_size(100))
print("num = 200的运行时间%f内存使用%s" % problem_size(200))
print("num = 400的运行时间%f内存使用%s" % problem_size(400))
print("num = 1000的运行时间%f内存使用%s" % problem_size(1000))
print("num = 10000的运行时间%f内存使用%s" % problem_size(10000))


结果是:

# num = 100的运行时间0.000499内存使用9641984
# num = 200的运行时间0.001750内存使用9670656
# num = 400的运行时间0.007945内存使用9670656
# num = 1000的运行时间0.064220内存使用9670656
# num = 10000的运行时间7.021932内存使用9670656


以上两个测试不知大家看出什么没有:对于循环来说,每嵌套一层循环,时间复杂度以指数级增长,即复杂度为:一层循环–>n;两层循环–>n^2;三层循环n^3;等等……

我们在编程中尽量避免使用循环嵌套。对于一个程序来讲,当出现两层以上的嵌套时,这个程序从算法复杂度角度来看就是不合格的,除非数据量小于100
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息