问题描述:对象
给定n个正整数, 要求从这些正整数中 取出若干个, 对他们进行xor(异或)计算, 寻找可能产生的最大值。二进制
xor运算有点相似于加法运算,可是它操做的是二进制的数字; 例如 101010 xor 111000 = 010010集合
ok解决任何问题,首先找出一些实际的例子, 例如在 集合 {5, 3} 中寻找;数字
首先写成2进制的形式:
1001 = 5
0011 = 3
有点相似于一个现行方程组矩阵的样子;
而咱们寻找的解是什么呢? 是这个方程组的xor 下的线性变化 产生的最大值 ?
为何?
xor 知足交换律 和 结合律;
线性变化,就是在不一样的方程之间使用xor操做, 用产生的结果替换 原来的方程, 这个新的方程组和原来的方程组等价;
为何等价?
A xor B = C => C xor B = A C xor A = B
原来的方程组能够逆向获得, 因此等价
怎么获得最大值?
采用高斯消元法 能够获得一个等价方程组, 例如集合{101010, 111000, 110101, 001111}
消元以后的结果是:
100101
010000
001101
000010
这个方程组的每一个方程的维度是6, 可是整个方程组的度 是 4; 即六维空间里面的一个4维的对象;
这4个方程任意xor的最大值是就是这四个方程所有xor的结果:
111010
为何? 好比第四列为0, 为了使第四列为1, 必须舍弃 第1 或 3 方程, 显然都不行;
而若是使6列为1, 须要舍弃 1 或者 3方程, 显然也不行;
而若是舍弃某个 方程,也不合适, 会致使某一位变成0
而由 xor的交换律 和结合律 能够知道: 全部组合的最后化简的结果 每一个方程最多出现一次 由于 A xor A = 0 0 xor B = B
如何证实这四个方程组的最大值就是 原来集合中的最大值呢?
由xor的计算的可逆性,咱们能够知道:
由于在集合 {101010, 111000, 110101, 001111} 中的任意元素均可以由最后咱们计算的四个方程表示;
因此集合中任意元素组合的xor结果均可以用 最后计算的4个方程表示。
而这4个方程xor的结果 最大值是 111010
上面的例子:
这个例子是方程的个数小于 维度的一个例子; 能够有3种状况:
个数 小于 维度; 独立方程的个数 就是原方程组方程的个数;
个数 等于 维度; 独立方程的个数 等于 维度
个数 大于 维度; 独立方程的个数 等于 维度
而要计算次大值:
能够从化简结果中舍弃一个最小的方程;
为何?
舍弃最小的方程, 将会致使 某一位 变成0, 而这一位是独立的; 其它位不会变化;
若是要使其它位变化,
要么这个位自己是独立的, 那么 就比舍弃最小的要大;
要么这个位依赖于其它位, 那么要么依赖于最小的独立位, 要么依赖于其它的独立位, 这样产生的结果要么等价于舍弃最小的方程,要么等价于舍弃其它方程, 都不合适
产生结果的实际个数:
4个方程的 任意组合 产生的结果的个数 是 2^4 = 16 (包含一个空集合); 也就是4个方程的任意组合结果有16个
对于一个32位二进制数, 最多有 2^32 种结果, 也就是32位二进制数自己的空间;