线性基是一个比较好学但是可能用处并不大的算法。
下面是我觉得比较好的两篇博客。
线性基浅谈
线性基详解
线性基的复杂度非常优秀,正常插入的话就是 \(O(n*64)\) 的,百万的数据是随便跑的。
线性基最重要的是它的几个优秀的性质,一般线性基的题目都考察这些性质。
-
原数集中的数字异或出来的值域 与 线性基中的元素以后出来的值域相等。
这个很重要,说明线性基可以代替原数集进行下一步的操作,也是线性基正确性的保障。 -
线性基是精简的,而不是冗余的。
这个就是说线性基是满足条件的最小数集,而且也不会多,具体来说有这么几个小性质:
线性基中没有异或和为零的非空子集。
线性基中的选取元素的每一种方案,都对应一个异或值,不存在多种选取方案对应同一个异或值的情况
以上为线性基的两大性质,这两个性质是线性基的基础。
关于做题的话,主要的难度方面是你很难想到这是一道线性基的题目,一般来说想到之后就不难了。
补充线性基基本用途:
- 查询n个数异或的最大值。
- 查询n个数异或的最小值。
- 查询某个数是否能被异或得到。
- 查询n个数异或的k小值。