python 实现分治算法案例

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

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

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

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

图1

重要代码:

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

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

# -*- coding: utf-8 -*-

"""

Created on Wed Mar  3 20:24:20 2021

@author: iron

"""

#分治算法问题

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由此可知,当楼层固定时,鸡蛋足够时,次数也只会固定在一个值,不会继续减少,也就是说前期鸡蛋越多次数越少,后期次数不随鸡蛋的增多而变化,二分法结果就是极限\033[0m")

其实还有很多经典的运用分治算法的例子,简书家人们可以在评论区发表。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原创 当时第一次看见状态转移方程这种解法时,简直被这种解法给感动住了,世上竟有如此简洁,强大之算法。其惊讶程度不亚...
    Cipolee阅读 9,995评论 1 6
  • 设原始数据规模为n,需要采样的数量为k 先选取数据流中的前k个元素,保存在集合A中; 从第j(k + 1 <= j...
    Impossible安徒生阅读 2,383评论 0 0
  • 夜莺2517阅读 127,793评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 11,835评论 1 6
  • 我是一名过去式的高三狗,很可悲,在这三年里我没有恋爱,看着同龄的小伙伴们一对儿一对儿的,我的心不好受。怎么说呢,高...
    小娘纸阅读 8,694评论 4 7