#!/usr/bin/env python
#! _*_ coding:UTF-8 _*_ from Queue import Queue import time que = Queue() time_begin = time.time() # 如果a+b+c=1000, 且a^2+b^2=c^2,a,b,c为自然数,求出a,b,c所有的组合 # 使用枚举法计算结果 for a in range(1001): for b in range(1001): for c in range(1001): if a + b + c == 1000 and a**2 + b**2 == c**2: que.put({'a':a, 'b':b, 'c':c}) time_end = time.time() print "运行的时间为 %d, 求解的结果如下:" % (time_end-time_begin) for item in range(que.qsize()): print que.get()
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/bat_day1/abc.py 运行的时间为 124, 求解的结果如下: {'a': 0, 'c': 500, 'b': 500} {'a': 200, 'c': 425, 'b': 375} {'a': 375, 'c': 425, 'b': 200} {'a': 500, 'c': 500, 'b': 0} Process finished with exit code 0
同样的问题,采用不同的算法,运行时间大大降低,如下:
#!/usr/bin/env python #! _*_ coding:UTF-8 _*_ from Queue import Queue import time que = Queue() time_begin = time.time() # 如果a+b+c=1000, 且a^2+b^2=c^2,a,b,c为自然数,求出a,b,c所有的组合 # 使用枚举法计算结果 for a in range(1001): for b in range(1001): c = 1000 - a - b if a**2 + b**2 == c**2: que.put({'a':a, 'b':b, 'c':c}) time_end = time.time() print "运行的时间为 %d, 求解的结果如下:" % (time_end-time_begin) for item in range(que.qsize()): print que.get()
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/bat_day1/abc2.py 运行的时间为 0, 求解的结果如下: {'a': 0, 'c': 500, 'b': 500} {'a': 200, 'c': 425, 'b': 375} {'a': 375, 'c': 425, 'b': 200} {'a': 500, 'c': 500, 'b': 0} Process finished with exit code 0
同样的问题,发现第一种算法用的时间为124S,第二种方法用的时间为不到1S;这就需要对不同的算法衡量运行效率;
如何衡量效率呢?运行效率不仅和运行时间有关,还和计算机的运行环境有关,同样的算法,在不同的计算机上执行,执行时间也是不一样的。
所以,运行效率应该用执行步骤相关,将执行步骤成为时间复杂度。
在第一种算法中:T(n) = n^3 * 2
在第二种算法中:T(n) = n^2 * 3
若不考虑系统和偏置项,则为渐进函数,使用渐进函数表示即为大O表示法:
在第一种算法中:T(n) = O(n^3)
在第二种算法中:T(n) = O(n^2)