当前课程知识点:算法设计与分析 > 5 Divide and Conquer > 5.1 Mergesort > Mergesort
这一章我们学习分治算法
所处理的都是一些最基本的问题
分治算法
形式上简洁优美
蕴含着丰富的创造性的工作
其分析和证明往往需要
细致的讨论和精巧的构造
所得到结果效率很高
有时甚至是出人意料的
分治算法一般把问题分成几个部分
递归地去求解每个部分
然后再把各部分的解组合为原问题的解
分治算法各式各样
但都包含分 治 合三步操作
分治算法中最常见的是
把规模为n的问题
分为2个规模为n/2的问题
递归求解这两个子问题
然后再把两个子问题的解
合并为原问题的解
通常合并所用的时间是线性的
对于这样的问题
一般说来强力搜索的算法需要n^2的时间
而分治算法只需要nlog n的时间
这里我们说的log n指的是log_2 n
我们通过几个例子来给大家展示分治算法
首先是并归排序问题
排序问题是算法中的最基本问题
给定n个元素
把它们按照某个序
比如说升序进行排列
排序问题有很多明显的应用
比如把目录中的文件进行排序
把音乐进行排序
电话簿中的名字进行排序 网页排序等等
还有很多不平凡的应用
比如说数据压缩 计算机图形
我们之前见到过的区间排序 最小支撑树
还有供应链管理
亚马逊的书籍推荐系统。。。
还有很多问题
当数据是有序的话
会变得比较简单
比如中位数问题
比如找最近点对问题等
排序问题的算法有很多
并归排序是常用的一种算法
并归排序算法把数据分为两部分
递归地对每一部分进行排序
然后再把有序的两部分合成一个整体
比如给出这样一个字母序列
algorithms
也就是我们的算法
我们把它划分为各五个字母的两部分
划分我们需要O(1)的时间
然后我们对两部分
分别进行排序
如果对于n个数的排序需要T(n) 的时间的话
那么每一部分需要T(n/2)的时间
总共需要2T(n/2)的时间
最后我们再把两个有序的子序列
合并成一个序列
这需要O(n)的时间
我们在刚才所叙述的算法中
需要把两个有序的列表
合并成一个有序的列表
我把这称为并归
如何有效的去实现并归呢
我们来演示一下
现在给定两组有序的序列
各包含5个数字
我们放两个指针
在这两个序列的第一个数字上
然后比较这两个数字的大小
我们会看到
右端的序列的
对应的数字比较小 是2
我们把这个2放到
我们新队列中的第一个
然后右边的指针向右移动一格
出现的数字是11
然后跟3进行比较
我们发现3比较小
那么把3放到我们新队列中的第二个位置
然后左边队列的指针向右移动一格
出现的是7
然后跟11进行比较
7比较小
把7放到新队列中
然后左边队列中的指针再向右移动一个格子
出现的是10
仍然是小于11
把它放到新队列的队尾
下一个数字是14
14大于11
那我们把11放到新的队列中
并且把这个队列中的指针向右移动一个格子
我们这样依次进行下去
我们就可以把这两个有序的这样一个队列
给它合并成一个整体的有序的一个队列
我们可以看到
线性的时间就可以完成并归的操作
我们先来做一点技术上的准备
T(n)是对于规模为n的列表进行并归排序
所需要的比较的操作次数
那么我们可以看到
当n等于1的时候 T(n)=0
如果n大于等于1的时候
我们要解决一个规模为n的问题
需要解决两个子问题
规模分别为n/2取上整和n/2取下整
对它们进行排序
需要T (n/2取上整)
以及T(n/2取下整的时间)
而合并的操作需要n的时间
所以我们有这样的递归关系的表达式
我们将证明
T(n)=O(nlogn)
我们将用不同的方法来证明这个结论
开始我们先简化证明
假设n是2的指数形式
并且把不等号用等号来代替
对于这样的递归关系
我们可以画出递归树的形式
要解决一个规模为n的问题
我们把它分为两个规模为n/2的问题
对应的合并操作是n次
我们继续分解
直到把问题分为平凡的情况
到T(2)
也就是说这个队列中只有两个元素
排序需要O(1)的时间
总共是n/2次排序
我们可以看到分解共有logn层
每一层对应的合并操作
分别为n,2×n/2,4×n/4等等
每一层对应的合并操作次数都是n
所以总共合并所需要的操作次数是nlogn
加上最后一层“治”的操作
总共比较的次数是O(nlogn)
所以总的运行时间也是O(nlogn)的
我们还可以用归纳法来证明
还是假设n是2的指数形式
我们证明满足递归表达式的T(n)=nlogn
对于n=1是显然的
我们假设T(n)= nlog n
往证T(2n)= 2n log 2n
根据T(n)的递归表达式
我们可以看到T(2n)=2 T(n)+2n
根据归纳假设它等于2nlogn+2n=2nlog2n
最后我们来证明一般的情况
在并归排序算法中
如果n=1 则不需要进行比较
对于一般情况
比较操作的次数不超过
对它两部分分别调用算法
所用的比较操作次数
及把它们合并所用的n次比较操作之和
因此并归排序算法的比较次数T(n)
满足下面的表达式
我们的结论是
T(n)≤n乘以logn取上整
也就是说T(n)=O(nlogn)
我们对于n进行归纳证明
对于n=1的情况
结论是平凡的
我们令n_1等于n/2取下整
n_2等于n/2取上整
对于1,2…n-1的情况 我们假设结论成立
根据T(n)的表达式我们有
T(n)≤T(n_1)+T(n_2)+n
根据归纳假设
T(n)≤n_1×logn_1取上整+n_2×logn_2取上整+n
因为n_1≤n_2
所以上式≤n_1×logn_2取上整+n_2×logn_2取上整+n
=n×logn_2取上整+n
≤n×(logn取上整-1)+n=n×logn取上整
-1.1 Introduction
-1.2 A First Problem: Stable Matching
--A First Problem: Stable Matching
-1.3 Gale-Shapley Algorithm
-1.4 Understanding Gale-Shapley Algorithm
--Understanding Gale-Shapley Algorithm
-Homework1
-Lecture note 1
--Lecture note 1 Introduction of Algorithm
-2.1 Computational Tractability
-2.2 Asymptotic Order of Growth
-2.3 A Survey of Common Running Times
--A Survey of Common Running Times
-Homework2
-Lecture note 2
--Lecture note 2 Basics of Algorithm Analysis
-3.1 Basic Definitions and Applications
--Basic Definitions and Applications
-3.2 Graph Traversal
-3.3 Testing Bipartiteness
-3.4 Connectivity in Directed Graphs
--Connectivity in Directed Graphs
-3.5 DAG and Topological Ordering
--DAG and Topological Ordering
-Homework3
-Lecture note 3
-4.1 Coin Changing
-4.2 Interval Scheduling
-4.3 Interval Partitioning
-4.4 Scheduling to Minimize Lateness
--Scheduling to Minimize Lateness
-4.5 Optimal Caching
-4.6 Shortest Paths in a Graph
-4.7 Minimum Spanning Tree
-4.8 Correctness of Algorithms
-4.9 Clustering
-Homework4
-Lecture note 4
--Lecture note 4 Greedy Algorithms
-5.1 Mergesort
-5.2 Counting Inversions
-5.3 Closest Pair of Points
-5.4 Integer Multiplication
-5.5 Matrix Multiplication
--Video
-5.6 Convolution and FFT
-5.7 FFT
--FFT
-5.8 Inverse DFT
-Homework5
-Lecture note 5
--Lecture note 5 Divide and Conquer
-6.1 Weighted Interval Scheduling
--Weighted Interval Scheduling
-6.2 Segmented Least Squares
-6.3 Knapsack Problem
-6.4 RNA Secondary Structure
-6.5 Sequence Alignment
-6.6 Shortest Paths
-Homework6
-Lecture note 6
--Lecture note 6 Dynamic Programming
-7.1 Flows and Cuts
-7.2 Minimum Cut and Maximum Flow
--Minimum Cut and Maximum Flow
-7.3 Ford-Fulkerson Algorithm
-7.4 Choosing Good Augmenting Paths
--Choosing Good Augmenting Paths
-7.5 Bipartite Matching
-Homework7
-Lecture note 7
-8.1 Polynomial-Time Reductions
-8.2 Basic Reduction Strategies I
--Basic Reduction Strategies I
-8.3 Basic Reduction Strategies II
--Basic Reduction Strategies II
-8.4 Definition of NP
-8.5 Problems in NP
-8.6 NP-Completeness
-8.7 Sequencing Problems
-8.8 Numerical Problems
-8.9 co-NP and the Asymmetry of NP
--co-NP and the Asymmetry of NP
-Homework8
-Lecture note 8
--Lecture note 8 NP and Computational Intractability
-9.1 Load Balancing
-9.2 Center Selection
-9.3 The Pricing Method: Vertex Cover
--The Pricing Method: Vertex Cover
-9.4 LP Rounding: Vertex Cover
-9.5 Knapsack Problem
-Homework9
-Lecture note 9
--Lecture note 9 Approximation Algorithms
-10.1 Landscape of an Optimization Problem
--Landscape of an Optimization Problem
-10.2 Maximum Cut
-10.3 Nash Equilibria
-10.4 Price of Stability
-Homework10
-Lecture note 10
--Lecture note 10 Local Search
-11.1 Contention Resolution
-11.2 Linearity of Expectation
-11.3 MAX 3-SAT
-11.4 Chernoff Bounds
-Homework11
-Lecture note 11
--Lecture note 11 Randomized Algorithms
-Exam