斯坦福算法专项课程Course1 week4内容回顾

这周的内容主要是介绍了Linear Time Selection以及图的基本知识。

课程地址:https://www.coursera.org/specializations/algorithms

Course 1 Week 4

Linear Time Selection

考虑如下问题

  • Input: 有$n$个数字的数组$A$以及一个数字$i$(这里假设数字都不同)
  • Output: 输出第$i$小的数字

如果我们先使用排序,再处理这个问题,那么需要的时间为$O(n\log n)$,现在的问题是能否找到更好的算法,我们先介绍Randomized Selection

Randomized Selection

回顾快速排序,在Partion之后,pivot左边的元素都小于pivot,pivot右边的元素都大于pivot,所以可以判断出pivot从小到大的次序$j$(等于小于pivot的元素个数加$1$):

  • 如果$i=j$,那么直接输出pivot。

  • 如果$i<j$,那么在小于pivot的$j-1$个元素中找第$i$小的元素。

  • 如果$i>j$,那么在大于pivot的$n-j$个元素中找第$i-j$个元素。

这样上述过程可以产生一个递归算法,描述如下:

上述算法之所以叫Randomized Selection,是因为这个算法的时间复杂度和pivot的选择有关,我们来看一个Quiz

Quiz

如果每次pivot都选择最糟糕的情形,Randomized Selection的时间复杂度为多少?

  • $\theta(n)$
  • $\theta(n \log n)$
  • $\theta(n^2)$
  • $\theta(2^n)$

假设$i=n$,每次都选择最小的的元素,那么一共要$n$次才能找到该元素,每次需要的时间为$\theta(n)$,所以一共的时间为$\theta(n^2)$

从这个例子中可以看出,同Quick Sort一样,我们应该给出尽可能平衡的划分,最好的pivot是中位数的位置,但这个是几乎不可能的,但是我们有如下定理:

Rselect Theorem

同Quick Sort一样,这里的平均时间复杂度是将pivot视为随机变量后得到的结果,接下来我们来证明这个定理。

Analysis

首先要注意上述算法的步骤2——Partion的时间正比于数组的长度$n$,不妨设比例系数为$c$,所以长度为$n$的数组Partion的时间小于等于$cn$。接来下来我们的目标是限制算法中步骤4,5的规模,考虑如下算法,在阶段$j$,我们不停地选择pivot,直到子问题的规模小于等于$(\frac 3 4 )^{j} n$再停止,记这个选择的次数为$X_j$,所以算法的时间复杂度$T(n)$有如下关系:

接下来我们来分析$X_j$,来看下第$j$轮子问题的规模小于等于$(\frac 3 4 )^{j} n$事件何时发生。考虑第$1$轮,我们要子问题的规模小于等于$(\frac 3 4 ) n$,如果我们取排名位于$\frac 1 4 n$到$\frac 3 4 n$的pivot,那么上述事件就会发生,由于是均匀选取,所以事件发生的概率为$\frac{\frac 3 4 n - \frac 1 4 n }{n}= \frac 1 2$,同理考虑第$j$轮也也可以得到相同的结论,从而上述问题转换为在$p=\frac 1 2$条件下某个事件第一次发生的概率,这实际上是几何分布,满足如下性质:

此处$p= \frac 1 2 $,所以$E[X_j]=2$。

利用上述结果估计$E[T(n)]$

这说明算法的平均时间复杂度为$O(n)$。

接下来考虑更强的算法——Deterministic Selection,这个算法的时间复杂度为$O(n)$。

Deterministic Selection

我们的关键问题是选择pivot,可以给出如下总结。

  • 回顾:“best” pivot = the median!

  • 目标:找到相当好的pivot

  • 关键想法:use “median of medians”!

从“median of medians”这个想法中,老师给出如下选择pivot的算法:

这个算法的思路就是“median of medians”:先选择$\frac n 5$个数,这$\frac n 5$都是每组的中位数,再对这个$\frac n 5$个数找他们的中位数。

利用选择pivot的算法,可以给出Deterministic Selection的算法:

接下来的任务是分析算法的时间复杂度,分析这个算法之前,我们先来看一个Quiz

Quiz

上述算法的步骤1需要的时间复杂度为多少?

  • $\theta(1)$
  • $\theta(\log n)$
  • $\theta(n)$
  • $\theta(n \log n)$

步骤1将数组拆成$\frac n 5$个大小为$5$的数组,然后对每个数组排序,由于对常数大小的数组排序的时间为$\theta(1)$,所以步骤1需要的时间复杂度为$\theta(n)$

有了这个结论,我们进入算法的分析。

Analysis I

设Determinis Selection的最大算法时间复杂度为$T(n)$,我们对每步都进行分析,可以得到下图:

上述图可以总结为如下式子

其中$T(?)$是步骤6,7产生的,现在的问题是计算$T(?)$的规模,我们有如下引理:

The Key Lemma

证明这个引理之前,先给出如下记号:

  • $k =\frac n 5=$组数

  • 令$x_i=k$个“middle elements”中第$i$小的元素,所以pivot$= x_{\frac k 2}$

可以用如下图像证明该引理:

同上图中可以看出,大于$x_{\frac k 2}$的元素数量至少为

小于$x_{\frac k 2}$的元素数量至少为

换句话说,$x_{\frac k 2}$一直位于$\frac 3 {10}n$到$\frac 7{10}n$的位置,从而子问题的规模小于等于$\frac 7{10}n$,引理得证。

结束这部分之前,再来看一个具体例子:

Analysis II

之前的引理即为$T(?)\le T(\frac 7{10}n)$,所以我们的递推式为:

这个式子无法使用主定理,但是可以使用数学归纳法来证明,取$a= 10c$,接下来我们来证明$T(n)\le a n$。

$n=1$时显然成立,假设$n< k$时,$T(n) \le a n$,那么$n=k$时

所以$n=k$时结论也成立,从而$T(n) \le an$,定理得证。

An $\Omega(n\log n)$ Sorting Lower Bound

这一部分讨论排序算法的时间下界,我们有如下定理:

$\text{“comparison based”}$的含义是通过比较元素大小来进行排序。

这里给出一些$\text{“comparison based”}$算法的例子:

非$\text{“comparison based”}$算法的例子:

证明:

长度为$n$的数组一共有$n!$中排列方式,$\text{“comparison based”}$算法可以用树状图表示,如下:

从树状图可以看出,$k$次比较一共产生了$2^k$个结果,所以如果我们要包括全部的排列方式,必然有

由斯特林公式

可以推出

从而

这周后一半的内容是介绍图。

Graph

Representing Graphs

图有两个元素,节点$V$和边$E$,边根据是否有向又分为有向图以及无向图。

来看一个图的例子:

根据定义,来看一个Quiz

Quiz 1

有$n$个点的无向图,没有平行边,并且是连接的(每个节点都有边相连),那么最少和最多的边的数量分别为多少?

  • $n-1, \frac{n(n-1)}{2}$
  • $n-1, n^2$
  • $n-1, 2^n$
  • $n-1, n^n$

因为每个节点都有边相连,所以至少要$n-1$条边,由于没有平行边,所以最多有$C_n^2 = \frac{n(n-1)}{2}$条边。

Sparse vs Dense Graphs

令$n=$图中节点的个数,$m=$图中边的个数,$m$一般满足$\Omega(n)$以及$O(n^2)$。

如果$m =O(n)$,那么称为“稀疏”图;如果$m =\theta(n^2)$,那么称为“密集”图。

接着介绍两种图的表示方法。

The Adjacency Matrix

邻接矩阵法使用一个$n\times n$的矩阵$A$表示图,将节点分别给出$1$到$n$的编号,如果节点$i,j$直接有边相连,那么$A_{ij} =1$,否则$A_{ij} =0$,这种表示方法还可以推广到边有权重以及无向图中,总结如下:

可以看到,邻接矩阵表示图需要的空间为$\theta(n^2)$。

Adjacency Lists

邻接表有如下元素:

分别为节点,边,每条边指向的节点,每个节点出发的边,占用的空间复杂度为

这门课程中一般都用邻接表来表示。

The Minimum Cut Problem

下面来讨论Minimum Cut问题。

  • Input:一个无向图$G = (V,E)$(允许平行边)
  • Output:找到一个cut,使得该cut穿过的边最少(Minimum Cut)

来看一张图:

这里老师直接给出如下算法:

Random Contraction Algorithm

注意这个算法是随机算法,所以有可能会失败,下面给出两个例子,分别对应成功与失败。

成功:

失败:

所以现在的关键问题是,这个算法成功的概率是多少?

The Analysis

在分析之前,先给出如下记号:

图$G=(V,E)$有$n$个顶点,$m$条边,固定一个minimum cut$ (A, B)$,$F$为穿过$(A,B)$的边的集合,$k$为$F$中边的个数,如下图所示:

我们来计算输出为 $ ( A, B)$的概率。

分析算法的过程,我们可知,输出为 $ (A, B)$当且仅当$F$中的边没有被合并,令$S_i$为第$i$轮$F$里的边被合并的事件,所以我们我们要计算的概率为:

其中$\overline S_i$表示$S_i$不发生,下标到$n-2$是因为剩下$2$个节点就停止算法,每一轮减少一个节点,所以需要$n-2$轮。

很显然地,我们有

在继续讨论之前,定义度(degree)为每个节点连接的边的数量,显然我们有如下等式:

由minimum cut的定义可知,每个边的度都大于等于$k$,而一共有$n$个点,所以可得如下不等式:

所以

现在第一步已经完成,我们来考虑第二步。第二步相当于在$n-1$个节点中找边数为$k$的minimum cut,设此时的边的数量为$m’$,上述讨论依旧成立,从而

同理可得

从而

可以看到,成功的概率很低,但是这只是一次实验的概率,而我们可以进行很多次实验,假设我们进行$N$次实验,那么:

接着利用

所以

如果取$N= n^2$,那么

如果取$N = n^2 \ln n$,那么

可以看到,如果实验次数足够多,全部失败的概率就会很小。

Counting Mininum Cuts

现在考虑另一个问题,计算Mininum Cuts的数量,之所以讨论这个问题,因为图可能有多个Mininum Cuts,例如节点个数为$n$的树有$n-1$个Mininum Cuts,这里老师直接给出结论:

分两步证明,分别证明大于等于以及小于等于。

先证明大于等于的关系,考虑下图的圆环。

显然Mininum Cuts有$2$条边,所以圆环情形至少有$C_n^2= \frac {n(n-1)}{2}$种Mininum Cuts,从而

再证明小于等于的关系,令$(A_1,B_1),…,(A_t,B_t)$为全部Mininum Cuts,由上一部分的讨论可知

因为$(A_i,B_i)$是互斥事件(每一次只输出一个结果),所以这些事件加起来的概率小于等于$1$,从而

所以结论成立。