2.Python算法之分治算法思想
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)分治法(divide and conquer method) 将原问题划分成若干个规模较小而结构与原问题相似的子问题,递归的解决这些子问题,然后再合其结果,就 ...
- 搞定面试算法系列 | 分治算法三步走
戳蓝字"CSDN云计算"关注我们哦! 作者 | 江子抑 转自 | 编程拯救世界 主要思想 分治算法,即分而治之:把一个复杂问题分成两个或更多的相同或相似子问题,直到最后子问题可以简 ...
- 算法- 递归算法 分治算法
递归算法 (1)递归需要满足的三个条件 一个问题的解可以分解为几个子问题的解 何为子问题?子问题就是数据规模更小的问题. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样 存在递归终止条 ...
- 五大常用算法之一——分治算法
分治算法(Divide and Conquer) 分治算法,简单理解就是把一个大规模的问题分成相同或者相似的子问题,直到最后子问题能很容易的求解,原问题的解通过子问题的解合并得到. 根据这个描述,我们 ...
- 十种常用算法之分治算法(java版)
十大常用算法的完整实现 一.二分查找算法:https://blog.csdn.net/weixin_46635575/article/details/121532149 二.分治算法:https:// ...
- 【Java -- 算法】分治算法、动态规划、回溯法、贪心算法
前言 一句话理解四种算法思想 分治:分而治之,先解决子问题,再将子问题的解合并求出原问题. 贪心:一条路走到黑,选择当下局部最优的路线,没有后悔药. 回溯:一条路走到黑,手握后悔药,可以无数次重来.( ...
- java根号n元素的合并排序算法_分治算法:根号n段合并排序算法
问题: 将数组 a[0,n-1]划分为 根号n 个子数组,每个子数组有 O(根号n)个元素.然后递归地对分割后的子数组进行排序,最后将所得到的根号n 个排好序的子数组合并排序. 工具与语言 我选择的为 ...
- 【Java算法】分治算法
1.什么是分治算法? 分治法(Divide-and-Conquer)是一种很重要的算法. 分治就是"分而治之"的意思,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子 ...
最新文章
- server 2003登录界面黑屏的解决办法
- VTK:Matlab之MatlabEngineFilter
- 定位position(前面布局无法实现
- Keil | 使用Register Windows测量函数的执行时间
- 软件设计中架构和框架的区别
- 把本地的jar包打包到maven本地仓库里
- 关于Android屏幕适配
- java 排队实现_java中的优先列队-PriorityQueue源码实现解析
- 免费网站推广,网站推广的方法
- HTML中美化页面,10 使用CSS美化页面
- excel熵值法计算权重_SPSSAU一众新功能上线:高级公式、综合得分一键计算
- 1. -vinc- = -vict- 胜利,征服
- php 算年龄,php – 根据出生日期计算年龄
- 司马相如和卓文君——野史+臆想
- reduceByKey
- 看完《指环王》说几句
- 细粒度控制Grails程序的日志输出
- windows下用mobaxterm代替mtputty
- linux的mtr参数详解,linux mtr 命令详解
- linux切换独显,Ubuntu 16.04如何切换Intel集显与Nvidia独显
热门文章
- Python——基于OpenCV获取倾斜子图的一种方法
- Git——[error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054]解决方案
- 最长不下降子序列问题
- linux下php的安装路径,Linux下Apache、PHP、MySQL默认安装路径
- matlab 除噪点,MATLAB应用在基于噪声检测的图像均值去噪法
- 用spring security设置用户jwt令牌和设置接口访问权限案例
- 360安全卫士 导致MySQL 5.0.24 自动关闭
- 2021年 第13届 全国大学生数学竞赛 初赛(非数学类)试题详细解答
- Android复习04(适配器 Get()请求 适配器 getView()方法 Post()请求 保存Cookie 流转字符串 从网上获取图片 重点考Json解析)
- Android NDK学习笔记3:JNI访问Java属性、方法