线性基

创建时间:2025-11-09


线性空间的概念

线性空间(Vector Space),是由一个数域 \(P\) 和集合 \(V\) 以及加法运算、数乘运算构成的结构,是线性代数中重要的研究对象。线性空间可以包含有限个元素,也可以包含无限个元素。

线性空间需要具备的性质
  1. 加法交换律:对任意的 \(a,b\in V\),有 \(a+b=b+a\)

  2. 加法结合律:对任意的 \(a,b,c\in V\),有 \((a+b)+c=a+(b+c)\)

  3. 加法单位元存在性:存在一个元素 \(0 \in V\),使得对任意的 \(a\in V\),有 \(a+0=a\)

  4. 加法逆元存在性:对任意的 \(a \in V\),存在一个元素 \(-a\in V\),使得 \(a+(-a)=0\)

  5. 数乘结合律:对任意的 \(k,l\in P,a\in V\),有 \((kl)a=k(la)\)

  6. 数乘分配律(左):对任意的 \(k\in P,a,b\in V\),有 \(k(a+b)=ka+kb\)

  7. 数乘分配律(右):对任意的 \(k,l\in P,a\in V\),有 \((k+l)a=ka+la\)

  8. 数乘单位元存在性:存在一个元素 \(1\in P\),使得对任意的 \(a\in V\),有 \(1a=a\)

将一个集合称为线性空间的基底当且仅当 \(V\) 中任意元素都可以由该集合中元素的线性组合表示出来。

常见的线性空间如三维向量空间,也即三维直角坐标系,它包含无限个形如 \((x,y,z)\) 的元素,\((1,0,0),(0,1,0),(0,0,1)\) 就是它的一组基底。

线性基的概念

设有若干元素 \(a_1,a_2,a_3,\cdots,a_n\),如果 \(a_1\) 能通过 \(a_2,a_3,\cdots,a_n\) 的线性组合表示出来,则称这 \(n\) 个元素线性相关,否则线性无关。

易证,当 \(a_1\) 可以被 \(a_2,a_3,\cdots,a_n\) 表示出来时 \(a_i\)\(2\le i\le n\))也能被其他元素表示出来。

线性基(Linear basis),是一组线性空间的基底,且其元素线性无关。

显然,线性基并不唯一,但只要能求出一组线性基,就能更简洁更快速地等效解决很多线性组合问题。

可以证明,线性基的元素个数一定且是所有线性空间的基底中最少的。

常用的线性基一般分为实数域下的线性基和布尔域下的线性基,而 OI 中布尔域下线性基用的更多,即线性基更多用于异或问题。

构造法求线性基

下面以P3812 【模板】线性基,布尔域下线性基为例:给定 \(n\) 个数,要求其子集的异或和的最大值。

该问题等价于求线性基的子集的异或和的最大值。

显然 \(0\) 不在线性基中,且存在线性基使得每个数的最高位都不同 \(^1\),现在考虑怎么求出这样一组线性基。

设最高位为 \(i\) 的数为 \(p_i\),如果不存在最高位为 \(i\) 的数,则 \(p_i=0\)

当有 \(x\in V\) 时,应尝试将数 \(x\) 插入线性基中时,首先考虑 \(x\) 的最高位 \(k\),可以证明线性基中必然有最高为 \(k\) 的数 \(^2\)。故当 \(p_k=0\) 时应将 \(p_k\) 赋值为 \(x\)。否则,已经存在了最高位为 \(k\) 的元素,根据 1 处证明,就算 \(x\) 在线性基中也应该将 \(x\) 替换为 \(x \oplus p_k\) 再尝试(显然此时 \(x\) 的最高位变低)。故只需要从高位到低位考虑便能求出线性基。

证明
1,存在线性基满足各数最高位互不相同:

假设线性基中 \(x\)\(y\) 的最高位相同,则可以保留 \(x\) 并将 \(y\) 替换为 \(x \oplus y\),这样 \(x\)\(y\) 的最高位就不再相同,并且原来可以通过线性组合表示出的数现在依旧可以。

2,当存在 \(x \in V\)\(x\) 的最高位为 \(k\)\(p_k\) 不可能等于 \(0\)

\(p_{i_1} \oplus p_{i_2} \oplus p_{i_3}\oplus \cdots =x\)\(p_{i_1}>p_{i_2}>p_{i_3}>...\)\(\forall i_j \neq k\))。显然 \(i_1>k\)。因为 \(p_{i_1-1},p_{i_1-2},p_{i_1-3},\cdots\) 中不存在其它第 \(i_1\) 位为 \(1\) 的数,所以 \(p_{i_1}\oplus p_{i_2} \oplus p_{i_3} \cdots\) 的第 \(i_1\) 位一定是 \(1\)。这与 \(x\) 的最高位为 \(k\) 矛盾,故一定有 \(p_k \neq 0\)\(\exist i_j=k\)

代码:

void check(long long x) {
	for (int k = LG - 1; ~k; k--)
		if (x >> k) {
			if (p[k] == 0) {
				p[k] = x;
				return ;
			}
			x ^= p[k];
		}
}

构造法的时间复杂度为 \(O(n\log W)\)

线性基的应用

回归原问题,现在已经得到了一组满足各数最高位互不相同的线性基,考虑怎样得到一个异或和最大的子集。

如果我们可以使每一位在线性基都仅有一个 \(1\),那么问题就变得简单了,全部选上就行了。而将每位都仅保留一个 \(1\) 也很好解决,可以参照高斯消元的思路在 \(j>i\) 的且 \(p_j\) 的第 \(i\) 位上是 \(1\)\(p_j\) 异或 \(p_i\)

完整代码
#include <iostream>

using namespace std;

const int LG = 52;

int n;
long long p[LG];

void check(long long x) {
	for (int k = LG - 1; ~k; k--)
		if (x >> k) {
			if (p[k] == 0) {
				p[k] = x;
				return ;
			}
			x ^= p[k];
		}
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		long long a;
		cin >> a;
		check(a);
	}
	
	for (int i = 0; i < LG; i++)
		for (int j = i + 1; j < LG; j++)
			if (p[j] >> i & 1)
				p[j] ^= p[i];
	
	long long ans = 0;
	for (int i = 0; i < LG; i++)
		if (p[i] != 0)
			ans ^= p[i];
	cout << ans << '\n';
	return 0;
}

在将线性基的每位保留一个 \(1\) 后不仅可以查询最大值,也可以查询最小值、k 大值,实现大同小异。有时也可能不需要做这一步转化,根据实际问题灵活应变即可。

P4570 [BJWC2011] 元素(线性基 + 贪心)
P3265 [JLOI2015] 装备购买(实数域下线性基 + 贪心)
P4301 [CQOI2013] 新Nim游戏(线性基 + SG函数)
CF1100F Ivan and Burgers(区间线性基)
CF845G Shortest Path Problem?(线性基与图论的结合)
P4151 [WC2011] 最大XOR和路径(双倍经验)
CF724G Xor-matic Number of the Graph(线性基与图论的结合)
P3292 [SCOI2016] 幸运数字(树上倍增+线性基合并)

posted @ 2026-06-02 16:31  xubaichuan  阅读(8)  评论(0)    收藏  举报