1.什么是分治算法?

2.为什么需要分治算法?

3.分治算法基础

4.分治算法的解题一般步骤

5. 用分治算法--求顺序表中的最大值

5. 用分治算法--判断某个元素是否在列表中

6. 用分治算法--找出一组序列中第K小的元素


1.什么是分治算法?

分治算法就是对一个问题采取各个击破的方法,将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。只要求出子问题的解,就可得到原问题的解。

2.为什么需要分治算法?

在编程过程中,经常遇到处理数据相当多、求解过程比较复杂、直接求解比较耗时的问题。

在求解这类问题时,可以采用各个击破的方法。

3.分治算法基础

具体做法是:先把这个问题分解成几个较小的子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个大问题的解。如果这些子问题还是比较大,可以继续把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治算法的基本思想

4.分治算法的解题一般步骤

(1)分解,将要解决的问题划分为若干个规模较小的同类问题。

(2)求解,当子问题划分得足够小时,用较简单的方法解决。

(3)合并,按原问题的要求,将子问题的逐层合并构成原问题的解。

5. 用分治算法--求顺序表中的最大值

# 基本子算法(子问题规模小于或等于2时)
def get_max(max_list):return max(max_list)# 分治法
def solve(init_list):list_length = len(init_list)# 若问题规模小于或等于2时,直接调用方法解决完成if list_length <= 2:return get_max(init_list)# 问题规模大时,开始分治算法的步骤# 1.分解(子问题的规模为   n/2),分别取列表其中的前半部分和后半部分left_list = init_list[:list_length // 2]right_list = init_list[list_length // 2:]# 2.分治、递归(一直递归,分解,知道求出前半部分的最大值,和后半部分的最大值)left_max = solve(left_list)right_max = solve(right_list)# 3.合并 (在把前半部分的最大值和后半部分的最大值做个比较,相当于求整个大数组的最大值)return get_max([left_max, right_max])if __name__ == '__main__':test_list = [12, 6, 5956, 7, 8, 98, 46, 46, 4, 451, 9684, 4]# 打印出最大值print(solve(test_list))# 9684

5. 用分治算法--判断某个元素是否在列表中

# 子问题算法(子问题规模为1)
def is_in_list(init_list, el):return [False, True][init_list[0] == el]# 分治法
def solve(init_list, el):list_length = len(init_list)if list_length == 1:  # 若问题规模等于1,即列表中return is_in_list(init_list, el)# 分解(子问题规模为 n/2)left_list = init_list[:list_length // 2]right_list = init_list[list_length // 2:]# 分治合并  递归(一直进行拆分,   or 只有所有都是 False,才返回假 False)# 所以只要有一个元素在里面,就判定元素在该列表中,res = solve(left_list, el) or solve(right_list, el)return resif __name__ == '__main__':test_list = [12, 6, 5956, 7, 8, 98, 46, 46, 4, 451, 9684, 4]# 查找print(test_list)print("判断45是否在列表中:", solve(test_list, 45))print("判断4是否在列表中:", solve(test_list, 4))

运行结果:

6. 用分治算法--找出一组序列中第K小的元素

# 划分(基于主元 pivot)
def partition(seq):pi = seq[0]  # 挑选主元min_pi = [x for x in seq[1:] if x <= pi]  # 所有小于主元的元素max_pi = [x for x in seq[1:] if x > pi]  # 所有大于主元的元素return pi, min_pi, max_pi# 查找第 K 小的元素
def select(seq, k):# 分解pi, min_pi, max_pi = partition(seq)min_pi_length = len(min_pi)  # 所有小于主元的元素长度# 如果查第 k 小的元素刚好和 比主元小的元素列表长度 相等,则此时pi(主元)则刚好为第K小的元素if min_pi_length == k:return pi# 长度小于k时,elif min_pi_length < k:# 分治、递归return select(max_pi, k - min_pi_length - 1)else:# 分治、递归return select(min_pi, k)if __name__ == '__main__':seq = [12, 6, 5956, 7, 8, 98, 46, 46, 4, 451, 9684, 4]print(seq)print("列表中第3小的:", select(seq, 3))print("列表中第1小的:", select(seq, 1))

运行结果:

2.Python算法之分治算法思想相关推荐

  1. 分治法的关键特征_算法系列之常用算法之一----分治算法

    一.基本概念 在计算机科学中,分治法是一种很重要的算法.分治算法,字面上的解释是"分而治之",分治算法主要是三点: 1.将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问 ...

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

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

  3. 搞定面试算法系列 | 分治算法三步走

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 江子抑 转自 | 编程拯救世界 主要思想 分治算法,即分而治之:把一个复杂问题分成两个或更多的相同或相似子问题,直到最后子问题可以简 ...

  4. 算法- 递归算法 分治算法

    递归算法 (1)递归需要满足的三个条件 一个问题的解可以分解为几个子问题的解 何为子问题?子问题就是数据规模更小的问题. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样 存在递归终止条 ...

  5. 五大常用算法之一——分治算法

    分治算法(Divide and Conquer) 分治算法,简单理解就是把一个大规模的问题分成相同或者相似的子问题,直到最后子问题能很容易的求解,原问题的解通过子问题的解合并得到. 根据这个描述,我们 ...

  6. 十种常用算法之分治算法(java版)

    十大常用算法的完整实现 一.二分查找算法:https://blog.csdn.net/weixin_46635575/article/details/121532149 二.分治算法:https:// ...

  7. 【Java -- 算法】分治算法、动态规划、回溯法、贪心算法

    前言 一句话理解四种算法思想 分治:分而治之,先解决子问题,再将子问题的解合并求出原问题. 贪心:一条路走到黑,选择当下局部最优的路线,没有后悔药. 回溯:一条路走到黑,手握后悔药,可以无数次重来.( ...

  8. java根号n元素的合并排序算法_分治算法:根号n段合并排序算法

    问题: 将数组 a[0,n-1]划分为 根号n 个子数组,每个子数组有 O(根号n)个元素.然后递归地对分割后的子数组进行排序,最后将所得到的根号n 个排好序的子数组合并排序. 工具与语言 我选择的为 ...

  9. 【Java算法】分治算法

    1.什么是分治算法? 分治法(Divide-and-Conquer)是一种很重要的算法. 分治就是"分而治之"的意思,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子 ...

最新文章

  1. server 2003登录界面黑屏的解决办法
  2. VTK:Matlab之MatlabEngineFilter
  3. 定位position(前面布局无法实现
  4. Keil | 使用Register Windows测量函数的执行时间
  5. 软件设计中架构和框架的区别
  6. 把本地的jar包打包到maven本地仓库里
  7. 关于Android屏幕适配
  8. java 排队实现_java中的优先列队-PriorityQueue源码实现解析
  9. 免费网站推广,网站推广的方法
  10. HTML中美化页面,10 使用CSS美化页面
  11. excel熵值法计算权重_SPSSAU一众新功能上线:高级公式、综合得分一键计算
  12. 1. -vinc- = -vict- 胜利,征服
  13. php 算年龄,php – 根据出生日期计算年龄
  14. 司马相如和卓文君——野史+臆想
  15. reduceByKey
  16. 看完《指环王》说几句
  17. 细粒度控制Grails程序的日志输出
  18. windows下用mobaxterm代替mtputty
  19. linux的mtr参数详解,linux mtr 命令详解
  20. linux切换独显,Ubuntu 16.04如何切换Intel集显与Nvidia独显

热门文章

  1. Python——基于OpenCV获取倾斜子图的一种方法
  2. Git——[error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054]解决方案
  3. 最长不下降子序列问题
  4. linux下php的安装路径,Linux下Apache、PHP、MySQL默认安装路径
  5. matlab 除噪点,MATLAB应用在基于噪声检测的图像均值去噪法
  6. 用spring security设置用户jwt令牌和设置接口访问权限案例
  7. 360安全卫士 导致MySQL 5.0.24 自动关闭
  8. 2021年 第13届 全国大学生数学竞赛 初赛(非数学类)试题详细解答
  9. Android复习04(适配器 Get()请求 适配器 getView()方法 Post()请求 保存Cookie 流转字符串 从网上获取图片 重点考Json解析)
  10. Android NDK学习笔记3:JNI访问Java属性、方法