程序设计不仅仅是软件架构和面向对象设计方面的事情,算法设计问题也是它要解决的一个方面。一个好的算法通常能在最短的时间内解决一个复杂的问题,在此,用Python比较两种简单的算法差异。
假设我们现在想从某个数字列表中找出两个彼此最接近但不相等的两个数,即找出两者绝对差最小的两个数。
算法1:
from random import randrange
import time
t1=time.perf_counter()
seq=[randrange(10**10) for i in range(1000)]
dd=float("inf")
for x in seq:
for y in seq:
if x==y:
continue
d=abs(x-y)
if d < dd:
xx,yy,dd=x,y,d
t2=time.perf_counter()
print("Time:",t2-t1)
算法1有两层嵌套循坏,它们各自都对seq进行了遍历,这是一个平方级的操作。在seq的序列长度为1000时,耗费的时间约为0.5s,而当序列长度增长到10000时,耗费的时间则为48s。可见算法1不是一个理想的算法。
算法2:
from random import randrange
import time
t1=time.perf_counter()
seq=[randrange(10**10) for i in range(1000)]
seq.sort()
dd=float("inf")
for i in range(len(seq)-1):
x,y=seq[i],seq[i+1]
if x==y:
continue
d=abs(x-y)
if d<dd:
xx,yy,dd=x,y,d
t2=time.perf_counter()
print("Time:",t2-t1)
算法2用Python内置的sort方法对序列seq进行了排序,排序好后的序列中相邻的两个数必然是最接近的,由此只需一次循环即可计算相邻两个数的绝对差比较即可。在这种情况下,时间复杂度大大降低,为线性对数操作级。在序列长度为1000时,耗费时间0.004s,当序列长度增长到10000时,耗费的时间也不够0.04s,大大提高了运行的效率。