MIT算法导论03-分治法
MIT算法导论03-分治法(Divide and Conquer)
课程名:Introduction to Algorithms
课程编号:6.046J/18.410J
授课教师:Prof.Erik Demame
分治法是本门课第一个算法设计方法
分治法将引出所有类型的递归。
分治法解决问题的步骤
Divide the problem (instance)
into one ore more subproblemsConquer each subproblem recursively
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\ge0n≥0 compute xnx^nxn
Naive algorithm x∗x∗x∗⋯∗xx*x*x*\cdots*xx∗x∗x∗⋯∗x
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/2∗xn/2xn−1∗xn−1∗xifnevenifnodd
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(n−2)+F(n−1)n=0n=1n≥2
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+1FnFnFn−1]=[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}[FnFn−1Fn−1Fn−2]=[1110]n−1
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+1FnFnFn−1]=[1110]n−1[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=1∑naikbkj
- 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-分治法相关推荐
- c++分治法求最大最小值实现_程序员:算法导论,分治法、归并排序,伪代码和Java实现...
分治法 我们首先先介绍分治法.分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后在合并这些子问题的解来解决原问题的解. 还是拿扑克牌举例子,假设桌上有两堆牌面朝 ...
- [转载] 算法导论:分治法,python实现合并排序MERGE-SORT
参考链接: Python中的合并排序merge sort 1. 简单合并排序法实现 思想:两堆已排好的牌,牌面朝下,首先掀开最上面的两张,比较大小取出较小的牌,然后再掀开取出较小牌的那一堆最上面的牌和 ...
- MIT 算法导论 (二)Math Notation
MIT 算法导论 (二)Math Notation O: f(n) = O(g(n)) , means that there are some suitable constants,such tha ...
- c语言分治法求众数重数_算法实验二 分治法 众数问题.pdf
算法实验二 分治法 众数问题 算法分析与设计实验二 分治法 主要内容 • 实验目的 • 主要实验仪器设备和环境 • 实验内容 • 实验要求 • 注意点 实验目的 • 理解分治法的基本思想 • 针对特定 ...
- 三大算法之一:分治法(带你用分治法思想优化程序,计算降低复杂算法的时间复杂度)
目录 零.前言 1.分治法 1.含义 2.分治法主要思想 3.分治法的求解步骤 1.确定初始条件 2.计算每一部分的时间复杂度 3.合并时间复杂度 4.求解 3.最大最小值问题 1.问题描述 2. ...
- aes算法实现c语言_以C语言实现归并排序为例,谈谈五大常用算法之一的“分治法”...
分治算法,顾名思义就是"分而治之",即把规模较大的复杂问题拆分为若干规模较小的类似子问题,并逐个解决,最后再将各个子问题的解决结果合并,得到原始问题的结果的方法.这个技巧是很多高效 ...
- 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. ...
- 用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...
一.算法思路 1.思路 分治算法的思想是:对于一个规模位N的问题,若该问题可以容易解决(比如规模N较小),则直接解决,否则将其分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同,递归 ...
- Java常用算法二:分治法
文章目录 一.分治算法的基本步骤 二.分治算法解决汉诺塔问题 2.1 汉诺塔的规则: 2.2 使用分治算法 笔记参考:尚硅谷 分治法就是把很复杂的问题分而治之,把一个很大的问题分成几个很小的问题,再把 ...
最新文章
- 嵌入式系统想学习笔记之五--uboot之常用命令
- 利用大数据,你将会购买更多的东西
- IBM 火雪挺:人工智能如何影响衣食住行?
- NOIP2017总结与反思
- 刚被IBM收购的红帽,它的下一站是中国
- 服务器突然关机的操作系统日志,一台R410 服务器不定时宕机,系统日志只有“上一次系统是意外关闭”...
- 雅安职业技术学院工业机器人专业_2017年雅安职业技术学院开设哪些专业(高职/专科)...
- Cisco vlan + vtp 配置实例
- POJ2262 ZOJ1951 UVa543 Goldbach's Conjecture
- php 5的手册,本手册中所涉及的 PHP 版本 - PHP 5 中文文档
- C++游戏编程教程(一)
- 2017年10大主流编程语言最新排行榜出炉
- 心电信号系统GUI系统
- python学习第一课——环境配置+比着葫芦画个瓢
- SpringBoot 集成 微信绑定 微信登录
- python和java哪个好薪资高-Java和Python哪个薪资更高?
- Ubuntu22.04 美化
- Android SDK 详解
- 学而时习之,不亦说乎
- linux查看命令所在软件包,Linux - 查看命令所属的软件包
热门文章
- Shell语言-16-Shell脚本调试 -n -v -x -c
- SAP HANA XS CDS简介
- “创新实践”项目介绍2:《3D点云中的汽车检测》
- SAP UI5 应用开发教程之八十五 - 如何用 OPA5 编写测试用例来测试用户输入文本的功能试读版
- 跑步听歌用哪种耳机更合适、推荐几款听歌跑步的耳机
- SPSS数据统计分析前准备【002期】
- 通过快递鸟如何接入韵达速递电子面单
- 基于JAVA博物馆交流平台计算机毕业设计源码+系统+lw文档+部署
- 【AI视野·今日NLP 自然语言处理论文速览 第十三期】Wed, 23 Jun 2021
- 爬虫重试模块retry,自动重试