问题来自一次采访: 如何构造一个圆(长度为2 ^ n的01轮序列)包含所有可能的n位二进制数,每个数字只出现一次。例如,当n = 2时,结果为:
0--0
| |
1--1
数字为{00,01,11,10}。所有可能的数字只出现一次。当n = 3时,这是一个示例答案:
0--0--1
/ \
0 1
\ /
1--0--1
答案 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字段中的原始多项式”以获得全面的列表。