德布鲁因序列

德布鲁因序列
德布鲁因序列的定义和性质

  1. 定义德布鲁因序列(De Bruijn sequence),记为B(k, n),是 k 元素构成的循环序列。所有长度为 n 的 k 元素构成序列都在它的子序列(以环状形式)中,出现并且仅出现一次。例如,序列 00010111 属于B(2,3)。 00010111 的所有长度为3的子序列为000,001,010,101,011,111,110,100,正好构成了 {0,1} 3 的所有组合。
  2. 长度德布鲁因序列的长度为 kn。注意到,所有长度为 n 的 k 元素构成的序列总共有 kn。而对于德布鲁因序列中的每个元素,恰好构成一个以此元素开头长度为 n 的子序列。所以德布鲁因序列的长度为 kn
  3. 数量德布鲁因序列的数量 B(k,n) 的数量为 (k!) ^ (kn-1) / kn 。我们用数学归纳法证明一下上述的结论。我们先假设德布鲁因序列是二进制的,即 k = 2。想计算序列数量总共有多少个,其实可以看这个序列每个子序列转换成10进制的数最大的是多少,那么就是它的数量。由于每相邻的子序列是相互依赖的关系,比如下一个子序列是前一个子序列左移一位再加上 0 或者 1,产生下一个子序列。当然最后要 mod 2n,这样控制每个子序列的长度都在 n 位之间。于是我们可以得到这样的一个式子:Go2. 长度德布鲁因序列的长度为 kn。注意到,所有长度为 n 的 k 元素构成的序列总共有 kn。而对于德布鲁因序列中的每个元素,恰好构成一个以此元素开头长度为 n 的子序列。所以德布鲁因序列的长度为 kn 。3. 数量德布鲁因序列的数量 B(k,n) 的数量为 (k!) ^ (kn-1) / kn 。我们用数学归纳法证明一下上述的结论。我们先假设德布鲁因序列是二进制的,即 k = 2。想计算序列数量总共有多少个,其实可以看这个序列每个子序列转换成10进制的数最大的是多少,那么就是它的数量。由于每相邻的子序列是相互依赖的关系,比如下一个子序列是前一个子序列左移一位再加上 0 或者 1,产生下一个子序列。当然最后要 mod 2n,这样控制每个子序列的长度都在 n 位之间。于是我们可以得到这样的一个式子:Go3. 数量德布鲁因序列的数量 B(k,n) 的数量为 (k!) ^ (kn-1) / kn 。我们用数学归纳法证明一下上述的结论。我们先假设德布鲁因序列是二进制的,即 k = 2。想计算序列数量总共有多少个,其实可以看这个序列每个子序列转换成10进制的数最大的是多少,那么就是它的数量。由于每相邻的子序列是相互依赖的关系,比如下一个子序列是前一个子序列左移一位再加上 0 或者 1,产生下一个子序列。当然最后要 mod 2n,这样控制每个子序列的长度都在 n 位之间。于是我们可以得到这样的一个式子:Go2. 长度德布鲁因序列的长度为 kn。注意到,所有长度为 n 的 k 元素构成的序列总共有 kn。而对于德布鲁因序列中的每个元素,恰好构成一个以此元素开头长度为 n 的子序列。所以德布鲁因序列的长度为 kn 。3. 数量德布鲁因序列的数量 B(k,n) 的数量为 (k!) ^ (kn-1) / kn 。我们用数学归纳法证明一下上述的结论。我们先假设德布鲁因序列是二进制的,即 k = 2。想计算序列数量总共有多少个,其实可以看这个序列每个子序列转换成10进制的数最大的是多少,那么就是它的数量。由于每相邻的子序列是相互依赖的关系,比如下一个子序列是前一个子序列左移一位再加上 0 或者 1,产生下一个子序列。当然最后要 mod 2n,这样控制每个子序列的长度都在 n 位之间。于是我们可以得到这样的一个式子:Go
    s[i+1]=(2s[i]+(0|1))mod(2^n)

利用错位相减法,我们可以得到通项公式:|B(2,n)|= 2 ^ 2(n−1) / 2n最后利用数学归纳法我们可以得到一个通用的式子,即:|B(k,n)| 的数量为 (k!) ^ (kn-1) / kn最最常用的德布鲁因序列就是 k = 2 。计算一下 |B(2,n)| 的数量,如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值