1. 程式人生 > >關於線性基的一丟丟理解

關於線性基的一丟丟理解

article 關於 markdown details 向量 存在 線性 是什麽 位數

線性基

有趣的東西
在某次考試時人人都切了一道題時才發現我沒學過線性基。。。

是什麽

我感覺它就是一個類似於向量基底的東西
線性基中的元素任選幾個異或起來是可以表達出原數組中的所有的值的,並且不能搞出其它的數

性質

  • 線性基無論怎麽選集合,只要是非空的,異或起來一定不是\(0\)
  • 線性基二進制最高位互不相同
  • 線性基中元素互相異或,異或集合不變
  • 線性基異或出原數組的異或方案唯一
  • 滿的線性基可以表示出所有正整數,準確來說是\(2\)的長度次方減\(1\)

求法

首先線性基中的一個元素\(a[i]\)的二進制最高位為\(1\),並且是第\(i\)
(以下所有都是二進制下討論的)
不斷原數組插入數\(x\)


從高往低枚舉位數
如果這個數的第\(i\)位為\(1\),並且\(a[i]\)為空
這一位沒有就補嘛,所以\(a[i]=x\)並且\(break\)
否則,這一位有,那就減去嘛
所以\(x \ xor=a[i]\)
一個數要麽被插入,要麽中途為\(0\)

合並

暴力一個一個丟到另一個中

查詢存在性

一個數是否能被線性基表示出來
只要執行插入類似的操作,中途為\(0\)則是

查詢最值

最小值就是最小的那個
最大值:
從高位開始枚舉,如果異或後變大,就異或

\(k\)小值

根據線性基二進制最高位互不相同的性質
可以得到一個方法
我們要將線性基改造成每一位相互獨立
如果\(i<j\)\(a[j]\)

的第\(i\)位是\(1\),就將\(a[j]\)異或上\(a[i]\)
那麽就只有\(a[i]\)的第\(i\)位為\(1\)
查詢的時候將\(k\)二進制拆分,對於\(1\)的位,就異或上對應的線性基
最終得出的答案就是\(k\)小值
\(emmm...\)這我也不知道為什麽

然後看一下這篇博客

關於線性基的一丟丟理解