推荐自己的专栏:分享一些Python案例,将所学用出来
一:算法时间复杂度分析函数的设计
程序的运行时间长度与算法的设计和所求解的问题的规模有关。当输入大小(即问题规模)增大时,程序的运行时间递增比例,即是算法的时间复杂度。设计思路如下:
定义函数buildData(n),构造并返回规模为n的测试输入数据。例如,排序随机n个数的列表。
def buildData(n):"""构造测试规模为n的输入数据,对于排序,随机n个数的列表"""data = [random.randrange(n) for i in range(n)]return data
定义函数timing(f, data), 返回调用f(data)的运行时间。
def timing(f, data):"""测量函数调用f(data)的运行时间分析"""start = time.time() #记录开始时间f(data) #运行f(data)end = time.time() #记录结束时间return end - start #返回执行时间
定义函数timingAnalysis(f, m1, m2, runs, buildData), 测量并输出函数f在不同输入规模: 10m1、10m1+1、 …、10m2 情况下运行runs次的平均时间。
函数调用buildData(n)规模为n的数据data,然后调用timing(f, data) 测量函数的运行时间。
def timingAnalysis(f,m1, m2, runs, buildData) :"""输出函数f在不同输入规模: 10**m1,.... ,10**m2运行runs次的时间"""for n in [10**i for i in range(m1, m2+1)]: #10**m1,...,10**m2data = buildData (n)total = 0.0 #初始化总时间for i in range(runs) : #重复运行runs次total += timing(f, data) #运行f并累计运行时间strResult = '输入规模{:10}时函数{:15}运行{}次的平均时间为: {} 秒'print (strResult.format(n, f.__name__, runs, total/runs))
在测试代码中,导入各种排序算法(不在本篇文章中赘述,有兴趣者可以下载完整代码查看),然后调用分析各排序算法的时间复杂度。
二:算法时间复杂度分析函数的实现与应用
time_analysis.py
import timeimport randomdef timing(f, data):"""测量函数调用f(data)的运行时间分析"""start = time.time() #记录开始时间f(data) #运行f(data)end = time.time() #记录结束时间return end - start #返回执行时间def timingAnalysis(f,m1, m2, runs, buildData) :"""输出函数f在不同输入规模: 10**m1,.... ,10**m2运行runs次的时间"""for n in [10**i for i in range(m1, m2+1)]: #10**m1,...,10**m2data = buildData (n)total = 0.0 #初始化总时间for i in range(runs) : #重复运行runs次total += timing(f, data) #运行f并累计运行时间strResult = '输入规模{:10}时函数{:15}运行{}次的平均时间为: {} 秒'print (strResult.format(n, f.__name__, runs, total/runs))def buildData(n):"""构造测试规模为n的输入数据,对于排序,随机n个数的列表"""data = [random.randrange(n) for i in range(n)]return data#测试代码if __name__ == "__main__" :from bubbleSort import bubbleSortfrom selectionSort import selectionSortfrom insertSort import insertSortfrom mergeSort import mergeSortfrom quickSort import quickSortdef quickSort1 (a) :quickSort(a, 0, len(a) - 1)#冒泡排序算法,时间复杂度分析timingAnalysis (bubbleSort, 2, 4, 1, buildData)print()#选择排序算法,时间复杂度分析timingAnalysis (selectionSort, 2, 4, 1, buildData)print()#插入排序算法,时间复杂度分析timingAnalysis (insertSort, 2, 4, 1, buildData)print()#归并排序算法,时间复杂度分析timingAnalysis (mergeSort, 1, 4, 1, buildData)print()#快速排序算法,时间复杂度分析timingAnalysis (quickSort1, 1, 4, 1, buildData)print()#内置排序算法sort,时间复杂度分析timingAnalysis(sorted, 1, 4, 1, buildData)
运行:
输入规模 100时函数bubbleSort运行1次的平均时间为: 0.000997781753540039 秒输入规模1000时函数bubbleSort运行1次的平均时间为: 0.10474658012390137 秒输入规模10000时函数bubbleSort运行1次的平均时间为: 8.514265298843384 秒输入规模 100时函数selectionSort 运行1次的平均时间为: 0.0 秒输入规模1000时函数selectionSort 运行1次的平均时间为: 0.044878244400024414 秒输入规模10000时函数selectionSort 运行1次的平均时间为: 4.592764377593994 秒输入规模 100时函数insertSort运行1次的平均时间为: 0.0009894371032714844 秒输入规模1000时函数insertSort运行1次的平均时间为: 0.0917809009552002 秒输入规模10000时函数insertSort运行1次的平均时间为: 7.810081720352173 秒输入规模 10时函数mergeSort运行1次的平均时间为: 0.0 秒输入规模 100时函数mergeSort运行1次的平均时间为: 0.000997304916381836 秒输入规模1000时函数mergeSort运行1次的平均时间为: 0.0029914379119873047 秒输入规模10000时函数mergeSort运行1次的平均时间为: 0.03091740608215332 秒输入规模 10时函数quickSort1运行1次的平均时间为: 0.0 秒输入规模 100时函数quickSort1运行1次的平均时间为: 0.0009975433349609375 秒输入规模1000时函数quickSort1运行1次的平均时间为: 0.001994609832763672 秒输入规模10000时函数quickSort1运行1次的平均时间为: 0.02396249771118164 秒输入规模 10时函数sorted 运行1次的平均时间为: 0.0 秒输入规模 100时函数sorted 运行1次的平均时间为: 0.0 秒输入规模1000时函数sorted 运行1次的平均时间为: 0.0 秒输入规模10000时函数sorted 运行1次的平均时间为: 0.0019676685333251953 秒