MIT算法导论03-分治法(Divide and Conquer)

课程名:Introduction to Algorithms
课程编号:6.046J/18.410J
授课教师:Prof.Erik Demame


分治法是本门课第一个算法设计方法
分治法将引出所有类型的递归。

分治法解决问题的步骤

  1. Divide the problem (instance)
    into one ore more subproblems

  2. Conquer each subproblem recursively

  3. Combine solutions

应用实例

归并排序(merge sort)

时间复杂度
T(n)=2T(n/2)+Θ(n)T(n)=2T(n/2)+\Theta(n)T(n)=2T(n/2)+Θ(n)

二分查找(binary search)

递归式:T(n)=T(n/2)+Θ(1)T(n)=T(n/2)+\Theta(1)T(n)=T(n/2)+Θ(1)
时间复杂度
T(n)=Θ(lgn)T(n)=\Theta(lgn)T(n)=Θ(lgn)

乘方问题 Powering a number

given number x
integer n≥0n\ge0n0 compute xnx^nxn
Naive algorithm x∗x∗x∗⋯∗xx*x*x*\cdots*xxxxx
T(n)=Θ(n)T(n)=\Theta(n)T(n)=Θ(n)

xn={xn/2∗xn/2ifnevenxn−1∗xn−1∗xifnoddx^n=\left\{ \begin{array}{cl}x^{n/2}*x^{n/2}&if\,n\,even\\x^{n-1}*x^{n-1}*x&if\,n\,odd\end{array}\right .xn={xn/2xn/2xn1xn1xifnevenifnodd

T(n)=T(n/2)+Θ(1)=Θ(lgn)T(n)=T(n/2)+\Theta(1)=\Theta(lgn)T(n)=T(n/2)+Θ(1)=Θ(lgn)

斐波那契数列 Fibonacci numbers

  • Naive recursive
    F(n)={0n=01n=1F(n−2)+F(n−1)n≥2F(n)=\left\{ \begin{array}{ll}0&n=0\\ 1&n=1\\ F(n-2)+F(n-1)&n\ge 2\end{array}\right .F(n)=01F(n2)+F(n1)n=0n=1n2

T(n)=Ω(φn)T(n)=\Omega(\varphi^n)T(n)=Ω(φn),其中φ=1.618\varphi=1.618φ=1.618为黄金分割数.

任何以多项式级为上限的算法就是好算法。-Jack Edmonds

  • bottom-up recursive algorithm
    compute F0,F1,F2,⋯,FnF_0,F_1,F_2,\cdots,F_nF0,F1,F2,,Fn
    T(n)=Θ(n)T(n)=\Theta(n)T(n)=Θ(n)

  • naive recursive squaring
    F(n)=φn/5F(n)=\varphi^n/\sqrt 5F(n)=φn/5

    rounded to nearest integer
    现实中这种方法不可用,因为,φ\varphiφ5\sqrt 55

    要用浮点数表示,算出来精确度会有损失。

实际上,在一台普通机器上,有些问题只能用指数时间的算法解决,而在一类理论机器上,可能可以在多项式时间内解决问题

  • recursive squaring algorithm
    Theorem [Fn+1FnFnFn−1]=[1110]n\begin{bmatrix}F_{n+1}&F_n\\F_n&F_{n-1}\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}^n[Fn+1FnFnFn1]=[1110]n

T(n)=Θ(lgn)T(n)=\Theta(lgn)T(n)=Θ(lgn)

proof: by induction on n
Base:[F2F1F1F0]=[1110]2\begin{bmatrix}F_{2}&F_1\\F_1&F_{0}\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}^2[F2F1F1F0]=[1110]2

Assume:[FnFn−1Fn−1Fn−2]=[1110]n−1\begin{bmatrix}F_{n}&F_{n-1}\\F_{n-1}&F_{n-2}\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}^{n-1}[FnFn1Fn1Fn2]=[1110]n1

Step: [Fn+1FnFnFn−1]=[1110]n−1[1110]=[1110]n\begin{bmatrix}F_{n+1}&F_n\\F_n&F_{n-1}\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}^{n-1}\begin{bmatrix}1&1\\1&0\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}^{n}[Fn+1FnFnFn1]=[1110]n1[1110]=[1110]n

QED

矩阵乘法 Matrix multiplication

Input: A=[aij],B=[bij]A=[a_{ij}], B=[b_ij]A=[aij],B=[bij]
i,j=1,2,⋯,ni,j=1,2,\cdots,ni,j=1,2,,n
Output:C=[cij]=ABC=[c_ij]=ABC=[cij]=AB
cij=∑k=1naikbkjc_{ij}=\sum\limits_{k=1}^na_{ik}b_{kj}cij=k=1naikbkj

  • Standard algorithms
    T(n)=Θ(n3)T(n)=\Theta(n^3)T(n)=Θ(n3)
for i=1 to n
do for j=1 to nc_ij=0do for k=1 to ndo c_ij=c_ij+a_ik*b_kj
  • Strassen’s algorithm

T(n)=7T(n/2)+Θ(n2)=Θ(nlg7)=O(n2.81)T(n)= 7T(n/2)+\Theta(n^2)=\Theta(n^{lg7})=O(n^2.81)T(n)=7T(n/2)+Θ(n2)=Θ(nlg7)=O(n2.81)
尽管如此,这并不是最优算法,目前最优的算法大概是Θ(n2.376)\Theta(n^{2.376})Θ(n2.376)

理论上Strassen’s algorithm快了一些,但是并不切实际,不要用这个。

超大规模集成电路 VLSI layout

Problem: Embed a complete binary tree
on n-leaves, in a grid with minimum area
顶点要放在网格点上,边组成正交路线,不能相交。

  • naive embedding


    L(n)=2L(n/4)+Θ(1)=Θ(n)L(n)=2L(n/4)+\Theta(1)=\Theta(\sqrt n)L(n)=2L(n/4)+Θ(1)=Θ(n

    )
    , case 1

MIT算法导论03-分治法相关推荐

  1. c++分治法求最大最小值实现_程序员:算法导论,分治法、归并排序,伪代码和Java实现...

    分治法 我们首先先介绍分治法.分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后在合并这些子问题的解来解决原问题的解. 还是拿扑克牌举例子,假设桌上有两堆牌面朝 ...

  2. [转载] 算法导论:分治法,python实现合并排序MERGE-SORT

    参考链接: Python中的合并排序merge sort 1. 简单合并排序法实现 思想:两堆已排好的牌,牌面朝下,首先掀开最上面的两张,比较大小取出较小的牌,然后再掀开取出较小牌的那一堆最上面的牌和 ...

  3. MIT 算法导论 (二)Math Notation

    MIT 算法导论 (二)Math Notation O: f(n) = O(g(n)) ,  means that there are some suitable constants,such tha ...

  4. c语言分治法求众数重数_算法实验二 分治法 众数问题.pdf

    算法实验二 分治法 众数问题 算法分析与设计实验二 分治法 主要内容 • 实验目的 • 主要实验仪器设备和环境 • 实验内容 • 实验要求 • 注意点 实验目的 • 理解分治法的基本思想 • 针对特定 ...

  5. 三大算法之一:分治法(带你用分治法思想优化程序,计算降低复杂算法的时间复杂度)

    目录 ​ 零.前言 1.分治法 1.含义 2.分治法主要思想 3.分治法的求解步骤 1.确定初始条件 2.计算每一部分的时间复杂度 3.合并时间复杂度 4.求解 3.最大最小值问题 1.问题描述 2. ...

  6. aes算法实现c语言_以C语言实现归并排序为例,谈谈五大常用算法之一的“分治法”...

    分治算法,顾名思义就是"分而治之",即把规模较大的复杂问题拆分为若干规模较小的类似子问题,并逐个解决,最后再将各个子问题的解决结果合并,得到原始问题的结果的方法.这个技巧是很多高效 ...

  7. MIT算法导论(一)——算法分析和引论

    文章目录 1 算法分析及引论 1.1 算法 1.2 排序 1.2.1 插入排序 1.2.1.1 插入排序原理 1.2.1.2 时间复杂度 1.2.1.3 渐进时间复杂度 1.2.1.4 回到算法 1. ...

  8. 用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...

    一.算法思路 1.思路 分治算法的思想是:对于一个规模位N的问题,若该问题可以容易解决(比如规模N较小),则直接解决,否则将其分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同,递归 ...

  9. Java常用算法二:分治法

    文章目录 一.分治算法的基本步骤 二.分治算法解决汉诺塔问题 2.1 汉诺塔的规则: 2.2 使用分治算法 笔记参考:尚硅谷 分治法就是把很复杂的问题分而治之,把一个很大的问题分成几个很小的问题,再把 ...

最新文章

  1. 嵌入式系统想学习笔记之五--uboot之常用命令
  2. 利用大数据,你将会购买更多的东西
  3. IBM 火雪挺:人工智能如何影响衣食住行?
  4. NOIP2017总结与反思
  5. 刚被IBM收购的红帽,它的下一站是中国
  6. 服务器突然关机的操作系统日志,一台R410 服务器不定时宕机,系统日志只有“上一次系统是意外关闭”...
  7. 雅安职业技术学院工业机器人专业_2017年雅安职业技术学院开设哪些专业(高职/专科)...
  8. Cisco vlan + vtp 配置实例
  9. POJ2262 ZOJ1951 UVa543 Goldbach's Conjecture
  10. php 5的手册,本手册中所涉及的 PHP 版本 - PHP 5 中文文档
  11. C++游戏编程教程(一)
  12. 2017年10大主流编程语言最新排行榜出炉
  13. 心电信号系统GUI系统
  14. python学习第一课——环境配置+比着葫芦画个瓢
  15. SpringBoot 集成 微信绑定 微信登录
  16. python和java哪个好薪资高-Java和Python哪个薪资更高?
  17. Ubuntu22.04 美化
  18. Android SDK 详解
  19. 学而时习之,不亦说乎
  20. linux查看命令所在软件包,Linux - 查看命令所属的软件包

热门文章

  1. Shell语言-16-Shell脚本调试 -n -v -x -c
  2. SAP HANA XS CDS简介
  3. “创新实践”项目介绍2:《3D点云中的汽车检测》
  4. SAP UI5 应用开发教程之八十五 - 如何用 OPA5 编写测试用例来测试用户输入文本的功能试读版
  5. 跑步听歌用哪种耳机更合适、推荐几款听歌跑步的耳机
  6. SPSS数据统计分析前准备【002期】
  7. 通过快递鸟如何接入韵达速递电子面单
  8. 基于JAVA博物馆交流平台计算机毕业设计源码+系统+lw文档+部署
  9. 【AI视野·今日NLP 自然语言处理论文速览 第十三期】Wed, 23 Jun 2021
  10. 爬虫重试模块retry,自动重试