首先从一个有意思的例子说起。巴尔的摩希尔顿酒店用一种新的密码锁替代了老式的锁。这个新的密码锁由四位0-9的数字组成,由顾客自己约定一个密码就可以按照这个密码打开他房间的锁。但是当顾客忘记自己设置的密码时该怎么办呢?按照排列组合的知识,最坏的情况一共要尝试10000次,即需要按40000次按键。假设只需要输入密码的一个序列中的最后四位对了就可打开这个锁,有没有更简单的办法呢?答案是肯定的,即构造一个序列使其所有的四元组均只出现过一次就行,最坏情况下一共需要10000+3次按键,其中的3次和最开始的3次一样[1]。接下来我们将构造这样的序列,该序列就称之为德布鲁因序列(De Bruijn sequence)。
德布鲁因序列(De Bruijn sequence),用一般的描述方法就是指一个含有k个元素的表,需要构成一个序列使n元组在这个序列中当且仅当出现一次。举一个简单的例子:下图给出了字母表为元素个数为2的二元组的德布鲁因序列。黄色表示二元组00,红色表示二元组01,绿色表示二元组11,蓝色表示二元组10。这种二元组的构造方式并不唯一。
[2]
德布鲁因序列的长度为k^n。可以做个简单的证明:因为n元组的每个元素的位置中可以出现k种情况,所以一共可以构成k^n个这样的各不相同的n元组。德布鲁因序列的前n个元素是第一个n元组,每往后移动一个元素出现一个新的n元组,移到最后一位时加上序列的前n-1个元素构成最后一个n元组,移动的次数=序列的长度=你元组的个数。
当知道序列之后可以对原有的所有n元组进行重构,仍取上面图所示为例,如下表所示:
(0 0) 1 1 ..........(0,0)
0 (0 1)1 ..........(0,1)
0 0 (1 1) ..........(1,1)
0)0 1 (1 ..........(1,0)
[1]H. Fredricksen, A survey of full length nonlinear shift register cycle algorithms, Soc. Ind. Appl. Math. Rev. 24 (2) (1982)195–221.