分治法

分治一般可以直接使用递归实现,在不考虑空间消费的情况下和迭代方式时间消耗相差不多

==================================================================

分治一般形式: T(n) = k*T(n/m) + f(n)

k为子问题个数,一般均分或者等比分

n/m问题规模,一般情况下m已经确认了子问题的个数,可以通过变换减少为a个

f(n) 为数据的处理,划分和综合工作量,可以增加预处理,从而减少在递归里面的操作

也就是把递归里面的操作尽量放在循环体外面处理

==================================================================

问题规模和个数k*T(n/m),k<=m,当然理论上也有T(n-m)的情况,在这种情况下子问题变得很多,且子问题可能相互依赖,不独立,无法逐个解决,需要按照顺序解决子问题,通常那种情况下使用动态规划解决。

所以可以看出来分治和动态规划的区别:一个子问题多,多的还有存在依赖,一个子问题少,且子问题独立,从一般的状态转移方程也可以看出区别,一个是减法衰减,一个是除法衰减。

这里还有一个思考,假如一个问题可以分解成很多个子问题,且子问题独立,这时直接使用分治或者是直接使用动态规划,都是和蛮力算法没有区别,这时就需要考虑使用分治优化策略,减少子问题k,或者通过减少步骤f(n)来优化。

二分检索

二分检索原问题可以看成3个情况,检索目标就在middle,检索目标在middle左边,检索目标在middle右边,f[left,right] = f[middle] or f[left,middle-1] or f[middle+1,right],

实际上二分检索可以看成分支限界法,arr[middle] 和 target比较剪枝,是分支限界的话,那么就需要知道解空间,解空间就是,检索目标的位置,通过深度增加,不断精确检测目标的位置,直到位置精确到1,[模糊位置,缩小范围,缩小范围,…,精确到1],这个过程是满足多米诺性质的,可以用剪枝来减少搜索空间。

#%%
# 注意递归的返回值,递归的要返回的话,要前后一致,或者直接基于某一层考虑,把递归看成结果
def binary_Serach_recursive(arr,left,right,target):middle = (left + right) // 2# 递归出口if left > right :return(-1)if arr[middle] == target:return(middle)elif arr[middle] < target:# 这里没有return的话,结果就没法return出来return binary_Serach_recursive(arr,middle+1,right,target)else:return binary_Serach_recursive(arr,left,middle-1,target)def binary_Serach_iterative(arr,target):left = 0right = len(arr)-1# 循环体条件while left <= right:middle = (left + right) // 2if arr[middle] == target:return middleelif arr[middle] < target:left = middle +1else:right = middle -1return -1#%%
arr = [7,3,66,33,22,66,99,0,1]
sort_arr = sorted(arr)
print(sort_arr)
print(binary_Serach_recursive(sort_arr,0,len(arr)-1,22))
print(binary_Serach_recursive(sort_arr,0,len(arr)-1,100))
print(binary_Serach_iterative(sort_arr,22))
print(binary_Serach_iterative(sort_arr,100))[0, 1, 3, 7, 22, 33, 66, 66, 99]
4
-1
4
-1

分治:分治和动态规划的区别,二分检索递归和迭代方式实现相关推荐

  1. 贪心算法、分治算法和动态规划的区别

    贪心算法.分治算法和动态规划的区别 (1)分治法(divide and conquer method) 将原问题划分成若干个规模较小而结构与原问题相似的子问题,递归的解决这些子问题,然后再合其结果,就 ...

  2. 分治算法的设计思想(二分检索、二分归并排序)

    分治策略思想: 将原问题划分或者归结为规模较小的子问题. 递归或迭代求解每一个问题. 将子问题的解综合得到原问题的解. 性质: 子问题与原问题具有相同的性质. 子问题的求解彼此独立. 划分时子问题的规 ...

  3. sql表中只有子节点的递归_动态规划与静态规划、递归、分治、回溯

    动态规划算是运筹学或者算法中的硬骨头了.不是说算法本身有多难,而是学完用完之后还是感觉到对其领会的不够深入,一种能用其术,不知其道的感觉.在很多教材或者回答中,经常看多将动态规划放在递归这一部分中.当 ...

  4. 递归、迭代、分治、回溯、动态规划、贪心算法

    今天就简单来谈谈这几者之间的关联和区别 递归 一句话,我认为递归的本质就是将原问题拆分成具有相同性质的子问题. 递归的特点: 1.子问题拆分方程式,比如:f(n) = f(n-1) * n 2.终止条 ...

  5. 动态规划(二)最优二分检索和0/1背包

    一.最优二分检索

  6. 递归、迭代和分治(1):递归

    ​1.从现实中理解三个概念 可能很多人就已经接触了递归了,不过我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是! 可能也有一大部分人知道递归,也能看的懂递归,但在实际做题过程中,却不 ...

  7. 【干货】10张GIF动图让你弄懂循环、递归、二分检索等概念

    作者:编程派 http://codingpy.com/article/10-gifs-to-understand-some-programming-concepts/ 这十张动图希望能让大家对循环.递 ...

  8. 你真的会写二分检索吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://t.cn/EiwP9qJ 1. 找出第一个与k ...

  9. 二分图带权最大匹配费用流_你真的会写二分检索吗?

    作者:liubird来源:http://blog.chinaunix.net/uid-1844931-id-3337784.html 前几天在论坛上看到有统计说有80%的程序员不能够写对简单的二分法. ...

最新文章

  1. 项目总结10:通过反射解决springboot环境下从redis取缓存进行转换时出现ClassCastException异常问题...
  2. 信令风暴问题根因分析
  3. 仅通过崩溃地址找出源代码的出错行
  4. 电子地图开发中栅格模型与矢量模型的区别
  5. 80040e14 mysql_【ASP】提示错误80040e14
  6. 聚合项目访问后台接口失败_聚合支付系统和免签支付系统对未来支付市场有哪些影响...
  7. mysql的安装和基本命令_MySQL安装以及简单命令用法
  8. Java面试 - List和Set比较,各自的子类比较
  9. 4.1 Spark SQL概述
  10. IS-IS详解(十九)——IS-IS 与IPv6
  11. 多线程 空值线程数_跳槽涨薪季面试题之多线程(三)
  12. 什么软件可以压缩图片大小?这几个软件值得收藏
  13. Linux中tar压缩命令详解
  14. oracle11g dataguard安装实施
  15. 《测绘管理与法律法规》真题易错本
  16. HNU程序设计-小数化分数
  17. echarts 图形变小 宽高为默认值
  18. php手术要休息多久,囊肿切除后需要休息多久
  19. 计算机工作原理 课件,计算机的基本结构和工作原理ppt课件.ppt
  20. 杭电和宁波大学计算机,浙江工业大学VS杭州电子科技大学,谁更好点?

热门文章

  1. MySQL新建库 添加用户及权限 MySQL的Grant命令
  2. java 压缩字节流_java 压缩 字节流 ,C#解压的问题
  3. python qq机器人框架有哪些_使用Python的Tornado框架实现一个简单的WebQQ机器人
  4. Hive mysql 内连接_Hive-表连接 | 学步园
  5. cocos2d-lua 搓牌效果_4款热门面霜评测,欧莱雅效果一般,艾珂薇性价比高,菲洛嘉最贵...
  6. 怎么new一个指针_19. Go语言里的 make 和 new 有什么区别?
  7. 目前最常用的计算机机箱类型为_服务器按照结构划分有几种类型
  8. java ArrayList排序
  9. selenium:反反爬拖动验证码
  10. oracle服务未启动失败,windows服务未启动导致 ORA-12560和RMAN-00554错误 | 信春哥,系统稳,闭眼上线不回滚!...