线性基
概念
一组线性无关1的向量可以作为一组基底,形成一个线性向量空间,这个基底就被称为 线性基。将这个线性基的基底进行线性运算,可以表示向量空间内的所有向量,即所有向量可以拆成基底的线性组合2。
特殊情况:一个线性空间的所有的法向量可以构成一个线性基
应用
处理有关 异或和的极值问题。
原理:
- 一个值转化为二进制表示长为n位,那么这就可以看作一个n维向量,那么就可以将其拆解为n个基底向量的线性组合
- 由于异或运算的封闭性3,向量组 { a , b } \{a,b\} { a,b}的基底与 { a , a ⊕ b } \{a,a\oplus b\} { a,a⊕b}相同
- 由于线性基要求线性无关1,所以当一个值 x x x要插入线性基 D D D时,插入的实际值为 x ⊕ ∑ d i ∈ D ⊕ d i x\oplus \sum_{d_i\in D}\oplus d_i x⊕∑di∈D⊕di
- 若存在 A ⊆ D A\subseteq D A⊆D,使得 x ⊕ ∑ d i ∈ A ⊕ d i = 0 x\oplus\sum_{d_i\in A}\oplus d_i = 0 x⊕∑di∈A⊕di=0,则代表 x x x已经能被 D D D线性组合而成,无需插入 x x x。(线性无关要求)
性质
- 设线性基的异或集合中不存在0。
- 线性基的异或集合中每个元素的异或方案唯一,其实这个跟性质1是等价的。
- 线性基二进制最高位互不相同。
- 如果线性基是满的,它的异或集合为 [ 1 , 2 n − 1 ] [1,2^n−1] [1,2n−1]。
- 线性基中元素互相异或,异或集合不变。
代码实现
构造
直接遍历所有元素进行单元素插入
插入
// 线性基
/