首页 > 其他分享 >线性基

线性基

时间:2024-07-10 16:45:52浏览次数:14  
标签:基中 二进制 插入 异或 线性 考虑

线性基

线性基是一种擅长处理异或问题的数据结构.设值域为 \([1,N]\) ,就可以用一个长度为 \(⌈\text{log}_2N⌉\) 的数组来描述一个线性基。特别地,线性基第\(i\)位上的数二进制下最高位也为第ii位。

一个线性基满足,对于它所表示的所有数的集合\(S\),\(S\) 中任意多个数异或所得的结果均能表示为线性基中的元素互相异或的结果,即意,线性基能使用异或运算来表示原数集使用异或运算能表示的所有数。运用这个性质,我们可以极大地缩小异或操作所需的查询次数。

插入和判断

我们考虑插入的操作,令插入的数为 \(x\) ,考虑 \(x\) 的二进制最高位 \(i\) ,

  • 若线性基的第 \(i\) 位为\(0\) ,则直接在该位插入xx,退出;
  • 若线性基的第 \(i\) 位已经有值 \(a_i\) ,则 \(x=x⊕a_i\) ,重复以上操作直到 \(x=0\) 。

如果退出时 \(x=0\) ,则此时线性基已经可以表示原先的 \(x\) 了;反之,则说明为了表示 \(x\) ,往线性基中加入了一个新元素。

很容易证明这样复杂度为 \(\text{log}⁡_2x\),也可以用这种方法判断能否通过原数列异或得到一个数 \(x\)。

void ins(ll x){
    uf(i,0,60){
	if(!(x>>i))continue;
	if(!a[i]){
	    a[i]=x;
	    break;
	}
	x^=a[i];
    }
}
bool check(ll x){
    uf(i,1,60){
        if(!(x>>i))continue;
        if(!a[i])return 0;
        else x^=a[i];
    }
    return 1;
}

查询异或最值

查询最小值相对比较简单。考虑插入的过程,因为每一次跳转操作, \(x\) 的二进制最高位必定单调降低,所以不可能插入两个二进制最高位相同的数。而此时,线性基中最小值异或上其他数,必定会增大。所以,直接输出线性基中的最小值即可。

考虑异或最大值,从高到低遍历线性基,考虑到第 \(i\) 位时,如果当前的答案 \(x\) 第 $ i$ 位为 \(0\) ,就将 \(x\) 异或上 $ a_i\(;否则不做任何操作。显然,每次操作后答案不会变劣,最终的\) x $ 即为答案。

同样,我们考虑对于一个数 \(x\) ,它与原数列中的数异或的最值如何获得。用与序列异或最大值类似的贪心即可解决。

查询kk小值

我们考虑进一步简化线性基。显然,一个线性基肯定可以表示为若干个形如 \(2^i\) 的数。从高到低处理线性基每一位,对于每一位向后扫,如果当前数第 \(i\) **位为 \(0\) *,且线性基第 \(i\)位不为\(0\) ,则将当前数异或上 \(a_i\) 。这一操作可以在 \(O(\text{log⁡}_2n)\) 的时间内解决。

经过这一步操作后,设线性基内共有 \(\text{cnt}\) 个数,则它们共可以表示出 \(2^{cnt}\) 个数。当然,对于 \(0\) 必须特殊考虑。如果插入的总数 \(n\) 与 \(cnt\) 相等,就无法表示 \(0\) 了。

同样,考虑最小值时,也必须要考虑到 \(0\) 的情况。事实上,如果插入时出现了未被加入的元素,就肯定可以表示出 \(0\) 。

随后,我们考虑将 \(k\) 二进制拆分,用与快速幂类似的方法就可以求出第 \(k\) 大值。

学过线性代数的同学应该可以看出,这个过程就是对一个矩阵求解异或意义下的秩的过程。因此,\(cnt≤⌈log⁡_2N⌉\)一定成立。而最终,线性基中保存的也是异或意义下的一组极小线性无关组。

同样,有关线性基的一切运算都可以看做矩阵的初等行列变换,也就可以将其看做线性规划问题。同样,可以离线使用高斯消元来构造极小线性基。

标签:基中,二进制,插入,异或,线性,考虑
From: https://www.cnblogs.com/WJChp/p/18294397

相关文章

  • 使用线性回归模型预测黄金ETF价格
    代码#用于数据处理importnumpyasnpimportpandasaspd#用于获取数据importakshareasak#导入线性回归模型fromsklearn.linear_modelimportLinearRegression#导入画图库、设置主题和中文显示importmatplotlib.pyplotaspltimportreplt.style.use('s......
  • 【数据结构】模块一:线性存储
    数据结构的学习大致可以分为三个模块,分别是:线性结构,非线性结构,查找和排序。首先从线性结构开始学起:线性结构,简单地说,就是把所有的结点用一根直线穿起来。线性结构可以分为连续存储(数组)和离散存储(链表)两种存储方式,共有两种常见的应用,即栈和队列,其二者只不过是简化版的数组......
  • 线性表——静态链表(插入阉割版)
    #include<bits/stdc++.h>usingnamespacestd;#defineMaxSize3typedefstructSNode{ intdata; intnext;}SLinkList[MaxSize];//初始化voidInitList(SLinkListL){ L[0].data=0; //我这里放的是链表长度 for(inti=0;i<MaxSize;i++){ L[i].next=-1; }}//......
  • 线性表——顺序表(动态分配)
    #include<bits/stdc++.h>usingnamespacestd;#defineInitSize5typedefstructSeqList{ int*data; //动态分配的数组指针 intlength; //数组当前个数 intMaxSize; //数组的最大容量}List;//动态分配的初始化voidInitList(List*L){ L->data=newint[InitSiz......
  • 线性表——单链表
    #include<bits/stdc++.h>usingnamespacestd;typedefstructLNode{ intdata; structLNode*next;}LNode,*List;//初始化voidInitList(List&L){ L=(LNode*)malloc(sizeof(LNode)); L->next=NULL;}//头插voidListInsertHead(List&L,inte)......
  • G64【模板】线性基 贪心法 P3812 最大异或和
    视频链接:G64【模板】线性基贪心法P3812最大异或和_哔哩哔哩_bilibili   P3812【模板】线性基-洛谷|计算机科学教育新生态(luogu.com.cn)//线性基O(63*n)#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;typedeflong......
  • 信号与线性系统笔记总结
    使用说明前三章是ppt加个人注释,后面都是手写笔记总结。在这里我要狠狠安利西电郭宝龙教授,他讲信号这门课很有耐心,也很有思路。笔记可能有错误的地方,后期会不断更正。参考视频:【西安电子科技大学——信号与系统(郭宝龙)】https://www.bilibili.com/video/BV1PZ4y1t7DA/?p=3&......
  • 【机器学习】基于线性回归的医疗费用预测模型
    文章目录一、线性回归定义和工作原理假设表示二、导入库和数据集矩阵表示可视化三、成本函数向量的内积四、正态方程五、探索性数据分析描述性统计检查缺失值数据分布图相关性热图保险费用分布保险费用与性别和吸烟情况的关系保险费用与子女数量的关系保险费用与地区......
  • 线性基
    谔谔,发现线性基其实不需要线性代数的一些概念也很好理解,浅谈一下。线性基定义线性基是一个最小的集合,满足集合中任意的异或值的集合与原序列的任意异或值的集合相等。性质1.原序列的数都可以通过线性基异或得到。2.线性基中不存在任何的子集的异或值为\(0\)。(因为如果......
  • 最大魅力值-线性dp
    蓝桥云课-最大魅力值#include<iostream>#include<cstring>usingnamespacestd;inta[101];intdp[101][101];intmain(){intn;cin>>n;for(inti=1;i<=n;++i){cin>>a[i];}memset(dp,-10000,sizeof(dp));/......