线性基学习笔记
来自蒟蒻XXJ的学习记录
定义
给定一个无符号的整数集合\(A\)
线性基的主要思想就是用尽量少的数字表示出\(A\)中的所有数字
首先根据尽量少就可以看出来线性基的第一个性质:
1.线性基中的所有数字都是不能由其他数字异或得到的
根据其主要思想就可以看出来第二个性质:
2.\(A\)中所有的数字都可以由线性基的某个子集异或得到
线性基的实现\(&\)线性基的构造
设集合中最大的元素在二进制意义下有\(L\)位
这种构造方法构造出的线性基中\(i,Bi\)一定满足以下的性质:
1.\(Bi=0\)时:
- 当且仅当\(j>i\)时,有可能出现\(Bj\)在第\(i\)位为\(1\)
2.\(Bi>0\)时:
-
整个\(B\)数组中只有\(Bi\)的第\(i\)
-
\(Bi\)比\(i\)高的二进制位上面一定是\(0\)
-
\(Bi\)比\(i\)低的二进制位上面有可能是\(1\) 如果出现了这种情况……好像那个\(Bj=0\)
线性基的构造是动态构造的,要从一个空的\(B\)集合开始,考虑在一个已存在的\(B\)中插入一个数字\(t\)
从\(t\)最高位上的\(1\)来考虑,如果这一位已经存在了\(1\)就要把\(t\)的这一位消掉才可以继续插入 于是就把\(t Xor Bj\)
如果这一位不存在\(1\)就直接把这个数字作为\(Bj\)
但是根据刚才的构造方法的分析:
-
最高位一定是\(j\)这个是一定可以保证的
-
对于位置上面比\(i\)低的二进制位\(k\)上的\(1\)若是存在\(Bk!=0\)那么就要\(Xor Bk\)
-
对于在线性基中位置比\(j\)靠后的 就要把他们的\(j\)位消掉 于是就直接\(Xor\)
所以这个算法的流程应该是显而易见的了……