异或空间

格雷码(Gray code)是一种任意两相邻项有且仅有一位不同的二进制编码。

直观来看,其构造方式如下:假如我们构造出了格雷码g0,1,,2m1g_{0, 1, \cdots, 2^m-1},现在考虑构造m+1m+1位格雷码。我们将前2m2^m位复制一遍,然后反转在原序列中的位置,也即g2m+i=g2m1i,i[0,2m)g’_{2^m+i}=g_{2^m-1-i}, i \in [0, 2^m);然后在最后2m2^m项格雷码的左侧分别添上11。由此有g2m+i=g2m1i+2mg_{2^m+i}=g_{2^m-1-i}+2^m

实际操作时,可以采用相邻两项的异或值与前缀异或和快速构造。假若有gxg_xgx1g_{x-1}的异或值序列s1,2,,2m1s_{1, 2, \cdots, 2^m-1},那么便有s2m+i=si,i[1,2m)s_{2^m+i}=s_{i}, i \in [1, 2^m),同时有s2m+1=g2m+1g2m=2ms_{2^m+1}=g_{2^m+1} \oplus g_{2^m}=2^m

例如,前8项格雷码的二进制表示为:{0b000,0b001,0b011,0b010,0b110,0b111,0b101,0b100}\{\text{0b}000, \text{0b}00{\color{blue}1}, \text{0b}0{\color{blue}1}1, \text{0b}01{\color{blue}0}, \text{0b}{\color{blue}1}10, \text{0b}11{\color{blue}1}, \text{0b}1{\color{blue}0}1, \text{0b}10{\color{blue}0}\},相邻两项异或值为{1,2,1,4,1,2,1}\{1,2,1,4,1,2,1\}

(更多…)

More
  • 2022年5月2日

考虑这个排列是怎样生成的。转述一下题意,可以发现,popcount(PiPi+1mod2n)=K\operatorname{popcount}(P_i \oplus P_{i+1 \mod {2^n}})=K,也即全集msk=2N1\text{msk}=2^N-1的一个大小为KK的子集。

由于这是一个环排列,我们不妨令P0=0P_0=0。这样一来,Pi=j=1iSj,Sj=KP_i=\operatorname{\bigoplus}\limits_{j=1}^{i}S_j, |S_j|=K。结合上文可知,这是一个相邻元素二进制位恰相差KK位的格雷码问题。有K=1K=1时,满足条件的SjS_j恰有NN个,也就是NN位格雷码。

考虑推广。我们发现,如果按照类格雷码的方式生成排列,则所有的SjS_j应构成异或空间,其大小应当恰为2N2^N,并且由线性空间知识可以得到,该线性空间的(基的大小)应当恰为NN。这恰好符合NN位格雷码的构造。因此,只要满足上述条件,就一定能够生成符合题意的排列。

可以证明,除了2K(K=NN>1)2\mid K \lor (K=N \land N>1)以外,总是有满足条件的线性空间生成的。

下述解法的时间复杂度O((NK)+2N)\operatorname{O}\left(\dbinom{N}{K}+2^N\right)(更多…)

More
  • 2022年4月11日