演算法 - 分治法(Divide-and-Conquer)
排版真的乱到一个 ¥*@#&?
- 一,Divide-and-Conquer(分治法)
- 二,Recurrences(递归)
- 1,替代法(Substitution method)
- 2,Tree Method
- 3,The Master Method
- 三,Divide-and-Conquer使用時機
- 四,遞迴演算法則的設計
- 1,Binary Search (二分搜尋)
- 五,总结
- 1,替代法(Substitution method),
- 2,主方法(The Master Theorem)
一,Divide-and-Conquer(分治法)
分治法的设计策略包含下列步骤:
- 切割(Divide):一个较大的问题切分成一个或多个小的问题。
- 征服(Conquer;或称为解决solve):解决每一个较小的问题。
除非问题足够小否则使用递归来解决。
- 合并(Combine):如果需要,将所有小问题的解答加以合并(combine),以获得原始问题的解答。
— 需要合并的问题:Merge Sort 归并排序
— 不需要和并的问题:Binary Search 二分搜索
二,Recurrences(递归)
递归是一个等式或不等式,它用函数在较小输入上的值来描述函数。
分治法求解递归式
- Substitution method 替换法
- Iteration method 策略迭代法
- Master method 主项定理
Technicalities
- We neglect certain technical details when we state and solve recurrences. A good example of a detail that is often glossed over is the assumption of integer arguments to functions. Boundary conditions is ignored. Omit floors, ceilings.
- 我们在陈述和解决复发时忽略了某些技术细节。一个经常被忽略的细节的好例子是对函数的整型参数的假设。忽略边界条件。省略下界和上界。
1,替代法(Substitution method)
使用步骤:
- 利用猜测、观察或汇整的方式,找出遞迴方程式的解
- 利用数学归纳法証明此解是正確的
Example:
Subtleties
Avoiding pitfalls
Changing variables
2,Tree Method
算法分析
Substitution Method
3,The Master Method
三,Divide-and-Conquer使用時機
下列兩種情況是適合使用Divide-and-Conquer設計策略 (也是遞迴演算法的適用時機)
- 问题本身具有递归关系
— 母问题可以被切分成较小的“相同”问题
— 如:階乘問題、費氏數問題、河內塔問題、快速排序問題、二元搜尋問題…等 - 资料结构属于递归定义
— 大量的Data Set,在切割后仍为一组具有“相同性质”的Data Set
— 如: 二元樹 (Binary Tree)、鏈結串列 (Link List)…等
四,遞迴演算法則的設計
1,找出問題的终止条件
2,找出問題本身的 递归关系(递归呼叫)
技巧:
- 思考遞迴呼叫需要哪些參數?
- 遞迴呼叫的傳回值為何?
- 遞迴呼叫的終止條件為何? 終止傳回何值?
1,Binary Search (二分搜尋)
实施前提:
- 檔案中記錄須事先由大到小排序過
- 須由Random (或Direct) access之機制支援 (e.g., Array)
原理:每次皆與Search範圍的中间值進行比較!!
python实现
# 返回 x 在 arr 中的索引,如果不存在返回 -1
def binarySearch (arr, l, r, x): # 基本判断if r >= l: mid = int(l + (r - l)/2)# 元素整好的中间位置if arr[mid] == x: return mid # 元素小于中间位置的元素,只需要再比较左边的元素elif arr[mid] > x: return binarySearch(arr, l, mid-1, x) # 元素大于中间位置的元素,只需要再比较右边的元素else: return binarySearch(arr, mid+1, r, x) else: # 不存在return -1# 测试数组
arr = [ 2, 3, 4, 10, 40 ]
x = 10# 函数调用
result = binarySearch(arr, 0, len(arr)-1, x) if result != -1: print ("元素在数组中的索引为 %d" % result )
else: print ("元素不在数组中")
算法分析
利用Time function
Review: Merge Sort
Time-Complexity
Avg. / Worst / Best Case:O(n log n)
以Recursive Merge Sort角度:
合併排序法包含了下列的步驟 :
- **切割(Divide)**該陣列成為兩個具有 n/2 個項目的子陣列。
- 征服(Conquer或稱解決solve)每一個子陣列。
• 除非該子陣列夠小,否則使用递归來做這件事。 - 合并(Combine) 所有子陣列的所有解答,以獲得主陣列的解答。
五,总结
分治法求解递归式
- Substitution method 替换法
- Iteration method 策略迭代法
- Master method 主项定理
1,替代法(Substitution method),
使用步骤:
- 利用猜测、观察或汇整的方式,找出遞迴方程式的解
- 利用数学归纳法証明此解是正確的
由於利用此方法求解遞迴方程式,最難的地方就是如何去猜出或汇整出递归方程式的解。所以一般只適合當已有候選解時,用來 驗証該解是否正確,也就是為了避開第一個步驟。
递归树法 (Recursion-tree Method)
適用於母問題由多个子问题所構成
使用一個树状结构表示遞迴演算法則在執行過程被递归呼叫的情況,這個樹狀結構稱為遞迴樹。其中:
- Node: 存放遞迴關係式所相對應之子問題的Cost
- Degree: 子問題的數目
遞迴樹法的三個步驟:
- 按照遞迴方程式展開
- 對每一层的所有子问题之cost加總,得到每一层的cost
- 加總每一層的cost,以得到total cost ,即為答案
通常只能求出Big-O或Ω,若要計算θ 得用“夾擠”法
范例一
范例二
2,主方法(The Master Theorem)
范例一
范例二
(2020年4月8日22:48:23)
演算法 - 分治法(Divide-and-Conquer)相关推荐
- 分治法 divide and conquer
分治算法包含以下步骤: 1.分(divide):将一个大问题分解成若干个子问题,每个子问题的问题规模n更小了,这样就有了好几个待解决的子问题. 2.治(conquer):递归的去解决每个子问题. 3. ...
- 分治法 Divide and Conquer思想及实际应用
分治思想 Divide and Conquer,即为分治法,基于分支递归的一种解决问题的思想方法. 分治分治,"分而治之"的意思,就是把一个复杂的原问题分成一个或多个相同子问题,而 ...
- 蛮力法-分治法-处理最近对问题
两种方法对最近对问题的解释 背景描述: 终于,隔了将近一周,开始更新第二篇算法博客.今天的问题是最近对问题.问题描述如下:对于二维坐标系中的若干个点,从中判断出相距最近的两个点,并输出最近的这个距 ...
- 求最大字段和问题(常规法,分治法,动态规划法)
算法设计与分析-----求最大字段和问题 问题描述:给定由n个整数组成的序列(a1,a2,a3......,an),求该序列的子段的最大值. 常规法: 从a1开始,求出以a1开头的子序列最大的和为su ...
- 求解最大连续子序列和问题(Java)蛮力法+分治法
求解最大连续子序列和问题 [问题描述] 给定一个有n(n>=1)个整数的序列,要求求出其中最大连续子序列的和. [样例输入] 6 -2 11 -4 13 -5 -2 [样例输出] 20 [问题求 ...
- 005-算法-分治法
一.概念: 在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以 ...
- 螺旋方阵(列举法,分治法,java版,逆时针)
目录 螺旋方阵介绍 1.适合基础薄弱同学的 列举法 2.螺旋方阵代码 螺旋方阵介绍 所谓"螺旋方阵",是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向 ...
- java分治法求数列的最大子段和_同事为进大厂天天刷Java面试题,面试却履败!究其原因竟是它在捣鬼。...
写在前面 疫情过后,招聘与求职受影响到底有多大?我不知道,但我的真实感受是,即使有疫情的影响,最近还是持续有朋友来跟我说他们今年工作的新动向.有人跳槽去了大厂,有人下定决心出来创业,也有人还在观望,等 ...
- 分治法(divide conquer algorithm)的理解
二分搜索中的合并 combination(所谓合并 combination,更像是取代),当前子问题的结果(最终搜索的结果)直接就是上一步大问题的结果: 1. 递归与分治 一旦找到从给定问题到其较小规 ...
最新文章
- l2-004 这是二叉搜索树吗? (25分)_什么是 “线段树” ?
- linux useradd命令使用示例
- 关于经纬度的两个计算[Teaksxgluxv]
- jzoj1252,P5194-天平【dfs,set】
- ES6新特性_ES6箭头函数以及声明特点---JavaScript_ECMAScript_ES6-ES11新特性工作笔记009
- 新书介绍:CCNA基础教程
- 李氏第二法分析稳定性matlab,9-4李雅普诺夫稳定性分析2010.ppt
- ecshop设置会员头像
- 斐波那契堆的java实现
- Alphabetic Removals详解(特殊算法巧解)
- 高盛为什么认为中国AI领域将超越美国?
- Element UI学习6--Carousel 走马灯
- 用PPT做的微信红包封面还可以这么玩?
- 连锁店管理系统如何助力零售业
- 2008年公休假安排:
- display、opacity、visibility的区别?
- python文本字符分析、编写程序接收字符串_python 文本分析Python编程中字符串和列表的基本知识讲解...
- 如何做好网站建设需求分析
- C/C++ 获取文件夹下的所有文件列表
- REXROTH力士乐比例溢流阀DBET6X/200G24K4V
热门文章
- Redis核心解读–集群管理工具(Redis-sentinel)
- iOS客户端monkey测试
- iOS开发实现资源包增量更新
- iOS 对接TopOn聚合广告心得
- Swin-Transformer-Object-Detection V2.11.0 训练visdrone数据(二)
- 郑州轻工业oj平台(1000题-1010题)
- 【日常分享】多邻国v4.93.4,在线学习英语、日语、韩语、德语…等30多种语言
- 美国要求签证申请人提供社交媒体账号 不给难入境
- 【STM32】一次F105 USB OTG驱动填坑记录
- 巧用Html5 History Api解决SPA的SEO问题