码迷,mamicode.com
首页 > 其他好文 > 详细

线性基

时间:2020-03-15 22:26:52      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:https   向量   isp   log   color   变换   tin   class   http   

定义:

??线性基是向量空间的一组基,通常可以解决有关异或的一些题目。是一个数的集合,并且每个序列都拥有至少一个线性基,取线性基中若干个数异或起来可以得到原序列中的任何一个数

  • 线性基的值域与原数组的值域相同,此处的值域是指任意数异或所能得到的值。

性质:

1.原序列里面的任意一个数都可以由线性基里面的一些数异或得到;
2.线性基里面的任意一些数异或起来都不能得到 \(0\)
3.线性基里面的数的个数唯一,并且在保持性质 \(1\) 的前提下,数的个数是最少的;

线性基的构造:

比如一列数:\(2,9,10,17\)\(d[i]\) 表示线性基中的元素,即二进制表示中最高位为第 \(i\) 位的数,唯一。
各自二进制表示为:
\(2\to 00010\)
\(9\to 01001\)
\(10\to 01010\)
\(17\to 10001\)
即:
\[ \left[ \begin{matrix} 0 & 0 & 0 & 1 & 0 \ 0 & 1 & 0 & 0 & 1 \ 0 & 1 & 0 & 1 & 0 \ 1 & 0 & 0 & 0 &1 \end{matrix} \right] \]
我们从二进制位的最高位开始:
\(4\) 位:
只有 \(17\) 一个,把 \(17\) 加入线性基中;
\(3\) 位:
先找到 \(10\) ,将其加入,然后有发现了 \(9\),因为 \(d[3]\) 是唯一的,所以不能将 \(9\) 加入。但是我们可以将 \(9\)\(9\bigotimes 10=3\) 来表示,这样当我们需要 \(9\) 时,可以用 \(3\bigotimes 10\) 得到。
这样原矩阵就变成:
\[ \left[ \begin{matrix} 0 & 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 & 1 \ 0 & 1 & 0 & 1 & 0 \ 1 & 0 & 0 & 0 &1 \end{matrix} \right] \]

\(2\) 位:
全部为 \(0\),跳过。
\(1\) 位:
先发现 \(3\) ,加入。所以 \(2\) 不能直接加入,同样变换为 \(2\bigotimes 3=1\)
\(0\) 位:
只有 \(1\),加入。
所以
\[d=\left[ \begin{matrix} 17 & 10 & 0 & 3 &1 \end{matrix} \right] \]
完成改造。
代码实现:

void insert(long long x) {
  for (int i = 66; i>=0; i--) {
    if (!(x >> i))  // x的第i位是0
      continue;
    if (!d[i]) {
      d[i] = x;
      break;
    }
    x ^= d[i];
  }
}

性质证明:

性质1:
其实改造过程就可以证明。
如果把一个数插入,那么这个数肯定能被表示;
如果不插入,那么这个数一定会用其他数异或后插入。
如果 \(x\) 不能成功插入线性基,一定是因为当前线性基里面的一些数异或起来可以等于 \(x\)
性质2:
由性质1。
性质3:
见参考博客1。

实际应用:

1.求最大值:

参考博客1
参考博客2

线性基

标签:https   向量   isp   log   color   变换   tin   class   http   

原文地址:https://www.cnblogs.com/1024-xzx/p/12500183.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!