首页 > 编程语言 >算法学习笔记(12): 线性基

算法学习笔记(12): 线性基

时间:2023-02-03 22:22:34浏览次数:43  
标签:12 int res 异或 笔记 算法 那么 ans xxj

线性基

熟练掌握异或运算是食用本文的大前提,请读者留意

是什么?

是一种利用线性代数的知识,用于解决异或问题的一种手段(不能算作数据结构吧这)

本文并不会涉及到线性代数。而是从OI基础算法思想的角度阐释线性基。尽管这可能违背了设计该方法的初衷。

一般来说,预处理的时间复杂度为 \(O(kn)\) 其中 \(k\) 一般为 \(31 \sim 32\),也就是 \(log_2max\)。单次操作一般也是 \(O(k)\) 的复杂度。

可以做什么?

  • 查询异或和第 \(k\) 小

  • 查询异或和最大值(最常用)

  • 某个数可否被异或出来

  • ……

如何实现?

xxj 是一个数组,至于为什么去这个名字……

xxj[i] 表示最高为 1 的位 i 的一个异或和(如果有的话)。

我们只需要维护这么 \(k\) 个数就行了

我们可以这么理解,0100 可以由 01010001 异或和起来,那么我们只需要维护 01010001 即可。

新增一个数

考虑如何新增一个数 x 进去?

由于我们维护的是异或和,那么对于 xxj 内的任何元素都可以异或上 x 以保证至多只有 \(k\) 个数。

假设 x 最高为 1 的位为 i,如果 xxj[i] 已经存在了一个数,那么我们将 x 异或上 xxj[i],重复上述步骤,否则,就令 xxj[i] = x

如果,最终 x 变成了 0,那么证明,用之前存在的数可以凑出 x,否则,不可以。

其实,这既是维护基的方法,也是判断某个数是否可以被异或出来的方法……

查询可以异或出来的最大值

这里,我们利用贪心的思想,先找到xxj内最大的数,也就是最高为 1 的为最高的那个数。

很明显,如果 i < j 那么 xxj[i] < xxj[j]

假如我们找到了 xxj[i],令 res = xxj[i],然后逆序 j 枚举 [0, i),如果,res 的第 j 位不为 1,那么res ^= xxj[j]

但是……我们的实现肯定不能如此复杂,那么就考虑贪心,如果 j 位为 变为了 1,那么之后的所有位都变为 1 做出的贡献都没有这个位做出的贡献大,那么我们优先保证最高位为1即可。

int qmax() {
    int ans = 0;
    for (int i = 30; i >= 0; --i) {
    	ans = max(ans, ans ^ xxj[i]);
    }
    return ans;
 }   

解释了跟没解释一样……

查询异或和第 \(k\) 小

暂时没时间写了,候补

标签:12,int,res,异或,笔记,算法,那么,ans,xxj
From: https://www.cnblogs.com/jeefy/p/17090605.html

相关文章

  • 【笔记】阅读姜启源《数学模型》(烂尾版)
    1.三个引例(1)椅子怎么放平(2)安全渡河(多步决策)(3)药物中毒(线性微分方程) 2.初等模型(1)光盘的数据容量(螺旋线)(2)双层玻璃窗(热传导)(3)划艇比赛的成绩与桨手数量的关系(4)实物交......
  • OpenMMLab AI实战营 第二课笔记 计算机视觉之图像分类算法基础
    OpenMMLabAI实战营第二课笔记计算机视觉之图像分类算法基础1.什么是图像分类?1.1问题的数学表示1.2视觉任务的难点1.2.1超越规则:让机器从数据中学习1.2.2机......
  • 代码随想录算法训练营第十七天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和
    一、昨日回顾与补充今天看了Day16讲解的视频,对于求二叉树最大深度、最小深度以及求完全二叉树的节点个数有了新的理解,总结如下:1.深度和高度的区别(之前就看看定义忽略......
  • 在 FreeBSD 12 上安装 Gitea
    引言Gitea是一个功能齐全的轻量级代码托管解决方案,后端采用Go编写,使用MIT许可证发布。它比GitLab更资源友好,互联网上许多知名开源项目依赖Gitea提供代码托管。......
  • 算法刷题 Day 29 | 491.递增子序列 46.全排列 47.全排列 II
    详细布置491.递增子序列本题和大家刚做过的90.子集II非常像,但又很不一样,很容易掉坑里。https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F......
  • Android笔记--Application
    Application生命周期在APP运行过程中有且仅有一个Application对象贯穿整个生命周期Application全局变量实例化:声明全局变量:......
  • 2023牛客寒假算法基础集训营6
    A#include<bits/stdc++.h>usingi64=longlong;intmain(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);intx;std::cin......
  • 2023牛客寒假算法基础集训营6
    2023牛客寒假算法基础集训营6比赛地址:2023牛客寒假算法基础集训营6_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ(nowcoder.com)部分题解:ABCDFGH......
  • P4024 [CTSC2012]统计学家
    P4024[CTSC2012]统计学家洛谷:P4024[CTSC2012]统计学家Solution首先考虑离散化。rev1&rev2发现要么\(n=1\),要么\(m=1\),相当于对于一个一维数列求区间逆序对......
  • Android笔记--外部存储空间
    存储文件的操作外部存储空间私有存储空间和公共存储空间外部存储空间分为私有+公有保存文件到外部存储空间的相关代码操作:私有空间:公有空间:记得增加权限(Android......