笔记:线性基
线性基学习笔记
概述
对于一组
线性代数中,我们知道:向量排列在行上,进行消元能得到一组基,排在列上,消元能得到极大线性无关组(也是一组基)。在布尔空间中,用异或运算表示 01 向量的线性变换。
异或线性基可以解决许多问题,例如:
- 求出一组基底,极大线性无关组。
- 计算一组数选择若干异或起来的最值,第
大值。 - 判断一个数能否被给定的一些数异或出来,并给出方案。
构造
同线性代数,我们可以直接进行高斯消元求出线性基,对于
我们还可以贪心构造线性基,代码量小,常数比消元法小。
我们需要构造的基地满足:每个基向量的二进制最高位均不相同。由此设
查询某向量能否被线性表示,只需要遍历线性基判断即可,过程和插入类似。
在异或的过程中,我们记录每一个基向量是被哪些向量异或出来的,查询时记录方案即可。
bool insert(int x)
{
for(int i=m;i>=0;i--)
{
if(x>>i&1)
{
if(a[i]>>i&1) x^=a[i];
else {a[i]=x; return 1;}
}
}
return 0;
}
性质
高斯消元构造的线性基,是行简化阶梯型,但贪心法构造的不是,下面两个例子来说明这一点(左边为消元法,右边为贪心法,重点看
即,主元列上只有一个向量这一位是
简化阶梯型是个很好的性质,为了在贪心法中得到简化阶梯型,可以在最后得到的基底中再执行一次消元,把主元列多余的
应用
以下的应用基于满足行简化阶梯型的基底。
- 异或最值,第
大
最小值:若某向量能被线性表示则为
最大值:由于每个最高位唯一,直接把基向量全部异或起来就行。
第
例题
Extracting Weights
- 题意
给一棵树,每个点有一个权值
- 题解
任意
注意要提前插入
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性