分治算法

分治算法的思想:将问题规模为n的原问题归纳为规模n/2的两个子问题,或规模n/m的m'个子问题;若规模缩小的子问题仍不能简单求解,则继续归约为规模更小的问题;分别求解小规模的子问题,并逐步综合得到原问题的解。

分治算法改进途径:1.通过代数变换减少子问题数。

                                 2.通过预处理减少递归内部计算量。

分治算法的经典例子:1.查找峰顶的算法。

重要代码:


2.关于两个鸡蛋判断楼层问题:

问题:经典的问题,给你两个鸡蛋,从100层楼上往下扔,从某个楼层开始,鸡蛋开始碎,请问最少扔多少次可以判断出楼层

#分治算法问题
import numpy as np #NumPy 是一个非常优秀的提供矩阵操作的包
def dynamic_program(eggs,floors):
    table=np.zeros((eggs+1,floors+1)) #返回来一个给定形状和类型的用0填充的数组
    #如果只有0楼或者一楼时
    for i in range(eggs+1):
        table[i][0]=0
        table[i][1]=1
    #如果只有一个鸡蛋
    for j in range(floors+1):
        table[1][j]=j
    #其他情况,table( eggs, floors) = 1+ Max(table( eggs-1 , floors-1), table( eggs, floors-x))
    for i in range(2,eggs+1):
        for j in range(2,floors+1):
            table[i][j]=2**63-1 #取值范围为-2**63~2**63-1
            for x in range(1,j):
                #table[i-1][x-1]表示鸡蛋在X楼碎了减小一个。table[eggs][j-x]
                #表示鸡蛋还是最开始的楼层变为j-x
                maxtable=1+max(table[i-1][x-1],table[i][j-x]) #子问题
                if maxtable<table[i][j]:
                    table[i][j]=maxtable
    print(table[eggs][floors])
if __name__ == '__main__':
    dynamic_program(2,100)
    dynamic_program(6, 100)
    dynamic_program(10, 100)
    print("\033[32;1m由此可知,当楼层固定时,鸡蛋足够时,次数也只会固定在一个值,不会继续减少\n"
          "也就是说前期鸡蛋越多次数越少,后期次数不随鸡蛋的增多而变化,二分法结果就是极限\033[0m")

 

其实还有很多经典的运用分治算法的例子,博友可以在评论区畅言。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值