2012百度之星第二場初始題-1

問題描述:對象

    給定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位二進制數自己的空間;

相關文章
相關標籤/搜索