定义
- 基:在线性代数中,基(也称为基底)是描述、刻画向量空间的基本工具。向量空间的基是它的一个特殊的子集,基的元素称为基向量。向量空间中任意一个元素,都可以唯一地表示成基向量的线性组合。如果基中元素个数有限,就称向量空间为有限维向量空间,将元素的个数称作向量空间的维数。
- 同样的,线性基是一种特殊的基,它通常会在异或运算中出现,它的意义是:通过原集合S的某一个最小子集S1使得S1内元素相互异或得到的值域与原集合S相互异或得到的值域相同。
构造
- 若干数的线性基是指一组数 a1,a2,...,an a 1 , a 2 , . . . , a n ,其中 ax a x 的最高位的1在第x位。
- 设要插入数x,从高位到低位扫一遍,设当前扫到第i位。
- 若x的(二进制下的)第i位为1,那么分类讨论:1. ai=0 a i = 0 ,令 ai=x a i = x ;2. ai>0 a i > 0 ,令 x=x⊕a[i] x = x ⊕ a [ i ] 。
- 这种构造方法的时间复杂度为 O(f∗n) O ( f ∗ n ) (f为位数,n为元素数量),但在求一些东西的时候需要特判。
- 还有一种6一点、但慢一点的构造方法。
- 这种方法多了一个操作:回消。我们在插x时,设其插在了 ai a i 位置,则首先用a[0~i-1]消掉 ai a i 的(二进制下的)第0~i-1位(能消就消),然后再用崭新的 ai a i 消掉a[i+1~f](f为位数)的(二进制下的)第i位。
- 此种构造方法的时间复杂度为 O(f2∗n) O ( f 2 ∗ n ) (f为位数,n为元素数量)。
性质
- 线性基有一基本性质:通过线性基中元素xor出的数的值域与原来的数xor出数的值域相同。
- 证明很显然。
- 假设x插在了 ai a i 位置,那么实际上 ai=x⊕{一堆aj的异或和} a i = x ⊕ { 一 堆 a j 的 异 或 和 } (其中x为初始的x)。因此,我们可以用a表示出x: x=ai⊕{一堆aj的异或和} x = a i ⊕ { 一 堆 a j 的 异 或 和 } 。
- 既然这样,当我们需要知道 x1⊕x2 x 1 ⊕ x 2 时,我们就可以利用它们对应的那些a来表示它们。
- 除此之外,线性基还有一性质:线性基没有异或和为0的子集。
- 这个可以用反证法。假设 ab1⊕ab2⊕ab3⊕...⊕abk=0 a b 1 ⊕ a b 2 ⊕ a b 3 ⊕ . . . ⊕ a b k = 0 ,那么 ab1=ab2⊕ab3⊕...⊕abk a b 1 = a b 2 ⊕ a b 3 ⊕ . . . ⊕ a b k 。
- 既然我们可用一堆a去表示出 ab1 a b 1 ,那么删去 ab1 a b 1 也没关系,故 ab1 a b 1 于线性基无用,与线性基是最小子集的定义矛盾。
- 因此,我总结了一个规律:任意选取线性基中的非0元素,将它们异或起来,那样每种方案所得的异或和都互不相同。
- 可以使用反证法。设方案A选用集合S1,方案B选用集合S2,两方案异或和相同。
- 若 S1∪S2=∅ S 1 ∪ S 2 = ∅ ,则 S1⊕S2=0 S 1 ⊕ S 2 = 0 ,与性质2:线性基没有异或和为0的子集矛盾。
- 若 S1∪S2≠∅ S 1 ∪ S 2 ≠ ∅ ,不妨设 S3=S1∪S2 S 3 = S 1 ∪ S 2 ,则易看出 (S1−S3)∪(S2−S3)=∅∧(S1−S3)⊕(S2−S3)=0 ( S 1 − S 3 ) ∪ ( S 2 − S 3 ) = ∅ ∧ ( S 1 − S 3 ) ⊕ ( S 2 − S 3 ) = 0 ,于是又变成情况1。
应用
- 异或集大小: 2非0元素个数 2 非 0 元 素 个 数 。根据性质3易得。