线性基的理解

2 篇文章 0 订阅
1 篇文章 0 订阅

线性基是定义在数域为二进制上的向量,二进制向量的加法即为异或运算,因此线性基多运用在异或运算方面。

如果有数组a[maxn],a中每一个元素都按二进制展开成一个向量,a中每一个元素都是一个向量,这里把a称为一个向量空间(向量域),它包含了部分向量。

线性基的定义:a向量空间的线性基,就是a的一个最大线性无关向量组。最大线性无关向量组的个数又称为a的秩。

最大线性无关向量组的性质:
(1):向量组内的向量线性无关
(2):a中的向量都可由向量组内的向量唯一表示(否则不满足线性无关的性质)

二进制向量的加法运算为异或运算,这意味着线性基可以通过异或得到a中的所有元素(向量),线性基的异或域和a中的异或域相同,a中每一个元素都可以由线性基唯一表示,线性基内的每一种表达都唯一对应一个向量,大小为x的线性基可以表达最多 2 x 2^x 2x个不同的向量,对应 2 x 2^x 2x不同的数值。

线性基是二进制向量,若a中每一个元素都为long long 类型,则线性基的大小不会超过64(要保证线性无关,long long 占64位,最大的情况是每一行都有一个1),但a中向量数目可能非常庞大,这相当于对a中向量做了压缩,而表示的异或集却相同,使得许多运算和询问能在允许的时间内完成。

如何构造线性基:

构造线性基的过程和求向量的最大无关向量组的原理相同:初始时可以选一个向量,以后每次选一个和当前已经选出的无关向量组线性无关的向量进去,最后无法再加入任何向量时得到的就是最大线性无关向量组。

求线性基可以通过构造一个对角矩阵,从第一行开始逐行考虑使得求解过程有序化:遍历a数组中的每一个元素,对每一个元素遍历每一行:如果这一行对角线位置不为1,那么a[i]就可以放在这一行,成为线性基的一员,另b[j] = a[i] ,表示第j行的向量为a[i],并在此结束对a[i]的遍历,开始遍历a[i + 1]。否则a[i] = a[i] ⨁ \bigoplus b[j],然后检查下一行,判断是否能放进去。

上诉过程就是有序的求最大线性无关向量组的过程,若每一行能放就放,不能放就做一下初等变化,使得这一行对角线的下方全为0,然后判断下一行是否可以放,如果找到了一行可以放,说明这个元素和当前构造的向量集仍是线性无关的,放进去也满足线性无关的性质。否则这个元素一定可以被向量集表示,放进去会破坏线性无关的性质,这样遍历完所有元素后一定能求出最大线性无关向量组。

相应的题型有很多,如求a数组集合的异或最大值,异或集合的第k大等,网上有博客有详细讲解,多刷题。

例如大佬博客:
https://blog.sengxian.com/algorithms/linear-basis
https://www.cnblogs.com/vb4896/p/6149022.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值