归纳、递归和归简-Python算法

归简法:

将某一问题转化成另一个问题。倾向于将一个为止问题归简成一个已解决的问题。归简法可能会涉及输入(操作中可能会遇到的新问题)与输出(已经解决的问题)之间的转化。


归纳法:

被用于证明某个语句对于大型对象类(通常是一些自然数类型)是否成立。我们首先要证明语句在某一基本情况(例如当数字为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的排序,我们将其归简成了“找出某已排序序列中的最接近的两个数”。在这种情况下,我们的归简处理(排序)并不会影响问题的答案。






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值