线性基
简介
线性代数中,基是描述向量空间的基本工具。一组向量空间的基(底)是指这个向量空间一个特殊的子集,集中的元素成为基向量,向量空间中的任意元素能唯一地用基向量的线性组合表示,由此将大问题“压缩”为小问题。
定义
称线性空间 \(V\) 的一个极大线性无关组为 \(V\) 的一组 Hamel 基 或 线性基,简称 基。定义 \(V\) 的线性基的维数为 \(\dim V\),即线性基中元素的数量。
性质
- 对于线性空间 \(V\),设其维数为 \(n\),则:
a. \(V\) 中任意 \(n+1\) 个向量线性相关。
b. \(V\) 中任意 \(n\) 个线性无关的向量均为 \(V\) 的一组基。
c. \(V\) 中任意无关的向量组均可通过插入一个或多个向量使其成为 \(V\) 的基。 - (子空间维数公式)若 \(V_1,V_2\) 均为关于 \(\mathbb P\) 的有限维线性空间,且 \(V_1+V_2,V_1\cap V_2\) 也满足该条件则 \(\dim V_1+\dim V_2=\dim(V_1+V_2)+\dim(V_1\cap V_2)\)。
异或空间线性基
OI 中通常研究的是异或空间线性基,即定义在 \(\mathbb Z_2^n\) 的线性空间。异化线性空间的基 \(P\) 具有一下基本性质:
- 等价性:在 \(P\) 上运算和在 \(V\) 上运算等价。
- 最优性:\(P\) 为满足上述条件的元素个数最小的集合。
- \(P\) 的任意非空子集异或和均不为 \(0\)。
- \(P\) 中元素二进制维数均不相同,以次保证线性无关。
构造
OI 中构造线性基的方式通常有两种,以异或空间线性基举例。
贪心法
将原集合的元素均转为二进制。考虑插入元素 \(x\),对于第 \(i\) 位为 \(1\),若 \(p_i\) 不存在,则令 \(p_i\gets x\);否则 \(x\gets x\ \text{xor}\ p\)。考虑这样构造保证了线性基中的每个元素二进制位数不同,且每个数均能在该过程中被异或出来。一个元素要么插入线性基,要么在循环结束时变为 \(0\),即可以被前面已经插入基中的元素线性表示。
具体应用:
- 求原集合中能异或出来的最大值:考虑从高位往低位扫描,若当前能使答案变大则选取。因为后面基中的元素位数均小于当前元素,所以正确性显然。
- 求原集合能异或出的最小值:即基中的最小值。因为无论异或上其它哪个元素均会使它变大(特判存在 \(0\) 的情况,即有元素没有插入线性基内,以 \(0\) 的形式退出循环)。
code
inline void ins (int x) {
for (int i = m; ~i; --i) {
if (!(x >> i)) continue;
if (!p[i]) { p[i] = x; return; }
x ^= p[i];
}
fl = 1;
}
高斯消元法
贪心法的本质使构造了一个元素二进制位数均不同的子集,显然用高斯消元也能实现。直接将原集合中的每个数的二进制位看成对应的系数矩阵即可。
具体应用
- 求极大值:高斯消元实现下就是所有元素异或起来的结果。
- 求极小值:同上贪心法。
code
inline void Gaus_Elimination () {
for (int i = m, cur = 1; ~i && cur <= n; --i) {
for (int j = cur; j <= n; j++) if (a[j] >> i) { swap(a[cur], a[j]); break; }
if (!(a[cur] >> i)) continue;
for (int j = 1; j <= n; j++) if (j != cur && (a[j] >> i & 1)) a[j] ^= a[cur];
++cur;
}
}
时间复杂度
若 \(n\) 为元素数量,\(m\) 为最高二进制位,则时间复杂度为 \(\mathcal O(nm)\),其中高斯消元常数较大。实数意义下线性基复杂度 \(\mathcal O(nm^2)\)。

浙公网安备 33010602011771号