归简法:
将某一问题转化成另一个问题。倾向于将一个为止问题归简成一个已解决的问题。归简法可能会涉及输入(操作中可能会遇到的新问题)与输出(已经解决的问题)之间的转化。
归纳法:
被用于证明某个语句对于大型对象类(通常是一些自然数类型)是否成立。我们首先要证明语句在某一基本情况(例如当数字为1时是成立的),然后证明它可以由一个对象“推广到”下一个对象(如果对于n-1成立,那么它对于n也成立)。
递归法:
主要被用于函数自我调用时,在这里,我们需要确保函数在遇到基本情况时的操作是正确的,并且能将各层递归调用的结果组合成一个有效的解决方案。
归纳法和递归法都倾向于将问题归简为(或分解)成一些更小的子问题,然后探讨出超然于这些问题之外的某一个步骤,并以此来解决整个问题。
书籍推荐《算法引论:一种创造性方法》http://download.csdn.net/download/pjx369a/9791827
从某个数字列表中找出两个彼此最接近但不相等的数(两者间的差的绝对值是最小的)
一个平方级的操作:
if __name__=="__main__":
from random import randrange
seq=[randrange(10*10) for i in range(100)]
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
print(xx," ",yy," ",dd)
print(seq)
首先我们知道,处理一个已排序的序列相对来说会更容易一些,而排序通常是线性对数级或
插入排序:最好情况时间复杂度为O(n),最坏情况时间复杂度 O(n^2) 。
http://blog.csdn.net/zhang_xiaomeng/article/details/71296210
归并排序:归并排序的最坏情况运行时间
http://blog.csdn.net/zhang_xiaomeng/article/details/71304978
堆排序算法:算法复杂度O(nlgn)
http://blog.csdn.net/zhang_xiaomeng/article/details/71703345
快速排序算法:平均时间复杂度:
http://blog.csdn.net/zhang_xiaomeng/article/details/72665879
很显然,已排序的序列中最接近的两个数必然是相邻的:
python内置数据结构的时间复杂度:http://blog.csdn.net/zhang_xiaomeng/article/details/72850910
sort的复杂度是‘
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
print(xx," ",yy," ",dd)
print(seq)
这里的原问题是:找出序列中的最接近的两个数,但通过对seq的排序,我们将其归简成了“找出某已排序序列中的最接近的两个数”。在这种情况下,我们的归简处理(排序)并不会影响问题的答案。