线性空间/线性基

线性基有啥用

我们有些时候会遇到类似这样的问题:给定一组数字,求异或和最大值。

我们可以用线性基来解决这个问题。

怎么构建线性基呢

那么我们怎么考虑这个问题呢?

我们可以类比于向量。

在向量中,我们可以用单位向量表示某一个方向上的单位量。并且我们能用n个单位向量导出一个$n$维的空间。

同理对于异或空间也是可以线性基来导出的。

我们可以把一个长整型看成$64$维的向量,每个方向为$0$或$1$。

我们考虑一个数能导出怎样的一个单位向量呢?

我们发现如果是单位向量,那么这个向量除了当前这个方向上为$1$,其余都是$0$。

但是在这里我们可以放宽这个要求,我们要求高位上全为$0$,这一位为$1$。

如果前$k$维的单位向量都已经被成功导出,那么我们就可以完全地掌控前$k$维的空间了。

大致就是这个意思。

我们考虑插入一个数的操作。

我们从高位(维)向低位(维)遍历,如果我们发现当前第$i$位上为$1$,也就说明了这一个数对这个$i$维空间有影响。

我们判断一下,当前这个空间是否已经被成功导出了,如果已经被导出的话,我们就有办法消除这个影响,也就是异或上当前这个空间的单位向量。

如果没有被成功导出,那么我们最高就能影响到当前这个空间了,记录这个向量为当前空间的单位向量,结束循环。

有没有插入失败的情况呢?

有,就是当前这个向量能被完全消除影响,也就是说能被之前的向量导出的时候。

实现

猜你喜欢

转载自www.cnblogs.com/onglublog/p/10047932.html