排版真的乱到一个 ¥*@#&?

  • 一,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)相关推荐

  1. 分治法 divide and conquer

    分治算法包含以下步骤: 1.分(divide):将一个大问题分解成若干个子问题,每个子问题的问题规模n更小了,这样就有了好几个待解决的子问题. 2.治(conquer):递归的去解决每个子问题. 3. ...

  2. 分治法 Divide and Conquer思想及实际应用

    分治思想 Divide and Conquer,即为分治法,基于分支递归的一种解决问题的思想方法. 分治分治,"分而治之"的意思,就是把一个复杂的原问题分成一个或多个相同子问题,而 ...

  3. 蛮力法-分治法-处理最近对问题

    两种方法对最近对问题的解释 背景描述:   终于,隔了将近一周,开始更新第二篇算法博客.今天的问题是最近对问题.问题描述如下:对于二维坐标系中的若干个点,从中判断出相距最近的两个点,并输出最近的这个距 ...

  4. 求最大字段和问题(常规法,分治法,动态规划法)

    算法设计与分析-----求最大字段和问题 问题描述:给定由n个整数组成的序列(a1,a2,a3......,an),求该序列的子段的最大值. 常规法: 从a1开始,求出以a1开头的子序列最大的和为su ...

  5. 求解最大连续子序列和问题(Java)蛮力法+分治法

    求解最大连续子序列和问题 [问题描述] 给定一个有n(n>=1)个整数的序列,要求求出其中最大连续子序列的和. [样例输入] 6 -2 11 -4 13 -5 -2 [样例输出] 20 [问题求 ...

  6. 005-算法-分治法

    一.概念: 在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以 ...

  7. 螺旋方阵(列举法,分治法,java版,逆时针)

    目录 螺旋方阵介绍 1.适合基础薄弱同学的 列举法 2.螺旋方阵代码 螺旋方阵介绍 所谓"螺旋方阵",是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向 ...

  8. java分治法求数列的最大子段和_同事为进大厂天天刷Java面试题,面试却履败!究其原因竟是它在捣鬼。...

    写在前面 疫情过后,招聘与求职受影响到底有多大?我不知道,但我的真实感受是,即使有疫情的影响,最近还是持续有朋友来跟我说他们今年工作的新动向.有人跳槽去了大厂,有人下定决心出来创业,也有人还在观望,等 ...

  9. 分治法(divide conquer algorithm)的理解

    二分搜索中的合并 combination(所谓合并 combination,更像是取代),当前子问题的结果(最终搜索的结果)直接就是上一步大问题的结果: 1. 递归与分治 一旦找到从给定问题到其较小规 ...

最新文章

  1. l2-004 这是二叉搜索树吗? (25分)_什么是 “线段树” ?
  2. linux useradd命令使用示例
  3. 关于经纬度的两个计算[Teaksxgluxv]
  4. jzoj1252,P5194-天平【dfs,set】
  5. ES6新特性_ES6箭头函数以及声明特点---JavaScript_ECMAScript_ES6-ES11新特性工作笔记009
  6. 新书介绍:CCNA基础教程
  7. 李氏第二法分析稳定性matlab,9-4李雅普诺夫稳定性分析2010.ppt
  8. ecshop设置会员头像
  9. 斐波那契堆的java实现
  10. Alphabetic Removals详解(特殊算法巧解)
  11. 高盛为什么认为中国AI领域将超越美国?
  12. Element UI学习6--Carousel 走马灯
  13. 用PPT做的微信红包封面还可以这么玩?
  14. 连锁店管理系统如何助力零售业
  15. 2008年公休假安排:
  16. display、opacity、visibility的区别?
  17. python文本字符分析、编写程序接收字符串_python 文本分析Python编程中字符串和列表的基本知识讲解...
  18. 如何做好网站建设需求分析
  19. C/C++ 获取文件夹下的所有文件列表
  20. REXROTH力士乐比例溢流阀DBET6X/200G24K4V

热门文章

  1. Redis核心解读–集群管理工具(Redis-sentinel)
  2. iOS客户端monkey测试
  3. iOS开发实现资源包增量更新
  4. iOS 对接TopOn聚合广告心得
  5. Swin-Transformer-Object-Detection V2.11.0 训练visdrone数据(二)
  6. 郑州轻工业oj平台(1000题-1010题)
  7. 【日常分享】多邻国v4.93.4,在线学习英语、日语、韩语、德语…等30多种语言
  8. 美国要求签证申请人提供社交媒体账号 不给难入境
  9. 【STM32】一次F105 USB OTG驱动填坑记录
  10. 巧用Html5 History Api解决SPA的SEO问题