线性基求交
问题:给定两组线性基 ,它们形成的线性空间的交怎么用一组线性基 表示呢?
仔细想想这个问题并不简单,因为如果简单地用 中所有能被 表示的基向量组出 的话是不对的,完全可能基向量不在 中但它们的线性组合在 中,如 。
那么可能可以考虑重构一下 ,尽量用在交空间中的向量来表示 。
如何找出一个非平凡的向量 使其在 中呢?我们不妨钦定 必选以避免 ,那么尝试用剩余的所有向量即 来表示 。如果表出来了令 为在 中的向量的异或和以代替 即可,否则包含 的向量都不在 中,删去 即可。
可以发现这样处理之后交空间不变且问题得到了简化,那么继续对 进行这样的处理,剩下的向量组 满足每个基向量都在 中,于是 ,构建 的线性基即为答案。
整个流程的复杂度瓶颈在于表示每个 时构建当前 的线性基。可以发现构建时 以前的向量都在 中从而不会产生贡献,我们只需构建 与 的并的线性基,而这可以通过后缀和处理。
那么整个算法过程就是:
构建辅助线性基 。
按顺序考虑
- 尝试用 表出 ,若成功则取出 所有在 中的向量的异或和 以更新 。
- 用 更新 (更新时保持原有基向量不变就可避免属于 的部分被修改)。
如果认为异或运算 那么算法复杂度为 ,其中 是值域,应该是比较优秀的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通