构造一个包含所有n位二进制数的圆

时间:2014-01-25 08:58:03

标签: algorithm

问题来自一次采访: 如何构造一个圆(长度为2 ^ n的01轮序列)包含所有可能的n位二进制数,每个数字只出现一次。例如,当n = 2时,结果为:

0--0
|  |
1--1

数字为{00,01,11,10}。所有可能的数字只出现一次。当n = 3时,这是一个示例答案:

  0--0--1
 /       \
0         1
 \       /  
  1--0--1

2 个答案:

答案 0 :(得分:5)

您需要构建二进制de Bruijn cycle。维基百科文章提出了几种方法:

  

De Bruijn序列可以通过在k个符号上取n维De Bruijn图的哈密顿路径(或等效地,(n-1)维De Bruijn图的欧拉循环)来构造。

     

另一种结构包括以字典顺序将所有长度除以n的Lyndon单词连接在一起。

     

De Bruijn序列也可以使用移位寄存器或有限域构建。

答案 1 :(得分:4)

线性移位反馈寄存器在生成此序列时非常方便:

从001开始,使用多项式p(x)= 101的LSFR生成7个下一位。 序列将是'001 1101 001'。 (LSFR的周期为2 ^ N - 1,缺少全零条目。)

注意到两端都出现相同的3位序列,我们将用0替换最后一个序列 - '00111010'。

数字0..7出现的偏移量分别为7,0,5,1,6,4,3,2。

通过对多项式具有1的前一个N位条目的所有位进行xoring来应用多项式。

    0 0 1
xor 1 0 1 => (0 and 1) xor (0 and 0) xor (1 and 1) => 1

    0 0 1 1
xor   1 0 1 ==> (0 and 1) xor (1 and 0) xor (1 and 1) => 1

作为一般规则,多项式在两端都有1,在中间有一些数量;一个人可以尝试强力搜索缺失的位或谷歌搜索“galois字段中的原始多项式”以获得全面的列表。