欧拉路径与 de Bruijn 序列

摘要

本文讲介绍图论中的欧拉图(或称为 欧拉路径)以及与其相关的 De Bruijn 序列 (de Bruijn sequences)。随之介绍 de Bruijn 序列在生物学基因组(genome sequences) 上的应用。

欧拉路径

欧拉路径的定义及举例

图论 (graph theory)如今已成为数学与计算机科学中一个重要的分支。可是在 300 多年前,图论还没有成为一门正式的学科的时候,大数学家欧拉为了解决著名的哥尼斯堡七桥问题,才将图论作为一门正式的学科引入到数学领域。

研究图论,自然要定义图。在图论中,一张图由顶点 (vertex)边 (edge) 构成。对于每个顶点,其连接的边的数目我们称为这个顶点的。我们定义欧拉路径如下:

定义:对于一个图 G \textbf{G} G,如果一条路径经过这个图中所有的边,且恰好经过一次,那么这条路径就是这个图中的一个欧拉路径。

比如对于如下的图 [1]:

请添加图片描述

其中的一个欧拉路径如下:

请添加图片描述

但是,注意到,并不是每个图都会有欧拉路径。比如下面的图(即著名的哥尼斯堡问题抽象成的图),就不存在欧拉路径。因为无论我们从哪个顶点出发,我们无法不重复得经过所有的边。或者说,我们无法进行 “一笔画” 把所有的边画完而且没有重复。

图3
对于欧拉路径,我们可以再细分成欧拉回路 (closed Euler path) 与欧拉开路 (open Euler path)。顾名思义,两者的区分在于路径的起点与终点是否是同一个节点。

  • 欧拉回路:起点与终点相同的欧拉路径
  • 欧拉开路:起点与终点不同的欧拉路径

欧拉路径存在的条件

上面我们看到了两个图,一个存在欧拉路径,而另一个不存在欧拉路径。那么什么样的图存在欧拉路径呢?我们分欧拉回路与欧拉开路两种情况讨论。

对于无向图,我们有

定理 1:对于欧拉回路的情况,一个无向图存在欧拉回路当且仅当这个图是连通图 (connected),并且每个顶点的度 (degree) 均是偶数。

定理 2:对于欧拉开路的情况,一个无向图存在欧拉开路当且仅当这个图是连通图 (connected),并且有且只有两个顶点的度是奇数。

上面我们提到过,这里一个顶点的度数就是这个顶点连接的边的数目。

怎么证明这两个定理呢?我们考虑欧拉回路,假设我们的路径经过顶点 A A A,那么会有一条路径进入 A A A,也会有一条路径离开 A A A。于是顶点 A A A 的度数一定会是偶数。注意我们考虑的是回路,所以对于一开始的起点,也会有一条路径终止于这个起点。

而对于欧拉开路,类似的,我们可以看到,出了起点与终点,其余的顶点的度数都会是偶数。

当然,上述论证并不是完整,因为定理给出了欧拉回路 (开路) 存在的充分必要条件。我们只是证明了必要性的部分。关于定理证明中的充分性的部分,我们以欧拉回路的充分性条件为例,即我们假设所有的顶点的度数都是偶数,希望证明一定存在一条欧拉回路。我们选取一个起点 A 1 A_1 A1,从 A 1 A_1 A1 出发,我们每经过一个顶点 A i A_i Ai,由于 A i A_i Ai 的度数是偶数,所以必然也会从 A i A_i Ai 再出发,而最终回到 A 1 A_1 A1。于是我们就有了一个回路 A 1 ⋯ A i ⋯ A 1 A_1 \cdots A_i \cdots A_1 A1AiA1。如果这条回路没有包括所有的边,那么除去这条回路和这条回路上的顶点,剩余的顶点的度依然是偶数。我们可以继续找到另一条回路,并且因为图是联通的,我们可以从 A 1 ⋯ A i ⋯ A 1 A_1 \cdots A_i \cdots A_1 A1AiA1 之中的一个顶点出发,作为下一条回路的起点。依次类推下去,因为总的顶点数和边数是有限的,我们总可以结束这个过程。而这些回路可以连接成为一条回路,这就证明了欧拉回路的存在。

下图展示了上述充分性条件的证明过程。其中黑色的回路表示第一次找到的回路,蓝色的回路表示找到第一个回路之后剩余的回路。

请添加图片描述

对于欧拉开路充分性条件的证明,方法也是类似的。

类似的,对于有向图,我们有

定理 3:对于欧拉回路的情况,一个有向图存在欧拉回路当且仅当这个图是连通图 (connected),并且每个顶点的入度 (in degree) 等于出度 (out degree)。

定理 4:对于欧拉开路的情况,一个有向图存在欧拉开路当且仅当这个图是连通图 (connected),并且有且只有两个顶点的入度不等于出度。对于这两个特殊的顶点,其中一个顶点的入度比出度大 1,这个点是欧拉开路的终点;另一个顶点的入度比出度小 1,这个点是欧拉开路的起点。

de Bruijn 序列

de Bruijn 序列的一个例子

作为欧拉回路的一个应用,我们来看 de Bruijn 序列。在定义 de Bruijn 序列之前,我们先看 binary state diagram 的有向图。所谓 state diagram,是指一种特殊的有向图。有向图的每一个顶点都是一个二进制的序列,这些序列的长度是相等的。而这些顶点通过有向边连接。并且每条有向边用 0 或 1 标注。顶点 A A A 指向顶点 B B B的条件是,把顶点 A A A 代表的二进制序列的第一个 比特 (bit) 去掉,然后在剩余的序列后面加上一个新的比特 e e e (0 或 1),等于顶点 B B B 所代表的二进制序列。那么就会有一条有向边从 A A A 指向 B B B。由顶点 A A A 指向顶点 B B B 的有向边的标注就是 e e e

我们举一个例子,

deBruijneg

在上图中,顶点 00 指向 01,是因为去掉 00 的第一个比特 0,然后在其后加入一个新比特 1,我们就能得到 01。连接 00 和 01 的边就用 1 标注。

有了上面的叙述,我们就可以定义 de Bruijn 序列了。

定义:如果我们有一个 alphabet Σ \Sigma Σ,其元素个数是 α \alpha α,那么其上的一个 de Bruijn 序列 S S S 是一个长度为 α n \alpha^n αn 的序列, S S S 包含所有 Σ \Sigma Σ 上长度为 n n n 的子序列。

对于上图中所显示的情况,对应于 Σ = { 0 ,   1 } ,   α = 2 \Sigma = \{0, \, 1 \}, \, \alpha = 2 Σ={0,1},α=2。如果 n = 3 n = 3 n=3,那么一个 de Bruijn 序列可以是 S = 00011101 S = 00011101 S=00011101。其长度为 α n = 2 3 = 8 \alpha^n = 2^3 = 8 αn=23=8。可以验证, S S S 包含了所有的长度为 3 3 3 的子序列,即 000 ,   001 ,   010 ,   011 ,   100 ,   101 ,   110 ,   111 000, \, 001, \, 010, \, 011, \, 100, \, 101, \, 110, \, 111 000,001,010,011,100,101,110,111。注意这里是把 S S S 当作一个循环的序列看待。

那么 de Bruijn 与欧拉回路有什么关系呢?我们发现,如果把上图中的每条有向边上的标注 (即 0 或 1),按照一条欧拉回路依次连接,我们就能得到一个 de Bruijn 序列。比如,我们从 00 连接到自己的边开始为例,按照一个欧拉回路依次连接所经过边上的标注,得到的一个序列是 01011100。可以验证这个序列包含了所有的长度为 3 的子序列。

为什么欧拉回路构造了 de Bruijn 序列?

首先我们注意到,上图中的四个顶点,即 00 \boxed{00} 00 01 \boxed{01} 01 10 \boxed{10} 10 11 \boxed{11} 11,代表了长度为 2 的所有的子序列。而所有长度为 3 的子序列可以通过长度为 2 的子序列在其后加 0 或 1 得到。而对于每个顶点,假设其对应 x 1 x 2 ,   x i = 0 , 1 x_1x_2, \, x_i = 0, 1 x1x2,xi=0,1,那么去掉 x 1 x_1 x1,我们可以在其后添加 0 或 1,得到一个新的长度为 2 的序列 (这个新的长度为 2 的序列可以是 x 1 x 2 x_1x_2 x1x2 自身)。所以,从每个 x 1 x 2 x_1x_2 x1x2 表示的节点出发,会有两条向外的边。

另一方面,我们考虑图中结构如下

请添加图片描述

的构造,如果我们按照欧拉回路依次连接有向边的方法,我们发现序列 a b c abc abc 可以通过 a b ab ab 节点的前面两个节点连接的边构成。而 c c c 就是当前上图中指向外的边。从而如果有向图中出现了上图中的结构,我们按照欧拉回路构造的序列就会包含 a b c abc abc

而由于顶点包含了所有长度为 2 的序列,并且每个顶点都有两条指向外的边,这些指向外的边与原来的长度为 2 的序列就构成了上述 a b c abc abc 的结构,于是所有长度为 3 的序列都存在于 a b c abc abc 的结构。而这种 a b c abc abc 的结构是会出现在按照欧拉回路构造的序列中的。所以我们通过欧拉回路构造的序列就构成了 de Bruijn 序列。

de Bruijn digraph (de Bruijn 有向图)

我把用来生产 de Bruijn 序列的有向图称为 de Bruijn 有向图 (de Bruijn digraph) [2]。比如上面用来生成 包含所有长度为 3 的二进制子序列的 de Bruijn 序列的有向图,就是一个 de Bruijn 有向图。下面我们将要说明这种 de Bruijn 有向图存在一个欧拉回路。

根据上一小节的分析,我们知道,每一个 x 1 x 2 x_1x_2 x1x2 顶点,会有两条向外的边,同样我们也会有两个顶点, 0 x 1 \boxed{0x_1} 0x1 1 x 1 \boxed{1x_1} 1x1 指向 x 1 x 2 x_1 x_2 x1x2。所以对每一个顶点 x 1 x 2 x_1 x_2 x1x2,它的入度和出度是相等的。所以这个 de Bruijn 有向图一定存在欧拉回路。

n > 3 n > 3 n>3 的 de Bruijn 序列

对于更多元素的 de Bruijn 序列,我们也可以构造相应的 de Bruijn 有向图来求解。比如求二进制的 n = 4 n = 4 n=4 的 de Bruijn 序列,我们可以先构造长度为 3 的全部子序列,然后建立 de Bruijn 有向图。下图显示了这个 de Bruijn 序列。

请添加图片描述

对于一般的情况,如果我们要构造一个包含所有长度为 n n n 的二进制子序列的 de Bruijn 序列,其长度至少应该是 2 n 2 ^ n 2n。而我们的构造方法需要从顶点为所有 n − 1 n - 1 n1 长度的二进制子序列构成的图中构造欧拉回路。而我们知道每个 n − 1 n - 1 n1 长度的子序列会有两条向外的边 (一条的标注是 0 一条的标注是 1)。所以,我们的 de Bruijn 有向图中一共有 2 n − 1 × 2 = 2 n 2^{n - 1} \times 2 = 2^n 2n1×2=2n 条边。那么欧拉回路的长度就是 2 n 2^n 2n,符合其长度的最小的要求。而根据上文分析,欧拉回路又包含了所有的长度为 n n n 的子序列。所以这样构造的 de Bruijn 序列就是满足包含所有长度为 n n n 的子序列中长度最短的序列。

de Bruijn 序列在基因学上的应用

我们知道 DNA 上的碱基可以是 A, T, C, G。如果我们想知道一个包含给定长度为 k k k 的子序列的碱基序列,我们可以通过构造 de Bruijn 有向图的方法去构造碱基序列。[3]

请添加图片描述

上图展示了通过在 de Bruijn 有向图中找欧拉回路的方法,来求解包含所有长度为 3 的碱基子序列的一个基因组组装的办法。注意到,在上图中,有向边的标注是长度为 3 的子序列,虽然与之前我们讲述的有向边的标注是长度为 1 的字节不一样,不过这没有本质的区别。

参考文献

[1] Graph theory, a problem oriented approach, Dan Marcus, The Mathematical Association of America (2008)

[2] Graph algorithms, 2nd edition, Simon Even, Guy Even, Cambridge University Press (2012)

[3] How to apply de Bruijn graphs to genome assembly, Phillip E C Compeau, Pavel A Pevzner & Glenn Tesler, Nature Biotechnology 29 (2011)

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值