python异或高阶应用-前缀异或法

前言

我们在算法中经常会看到前缀和的解法,能够有效地降低算法复杂度。有一个和前缀和非常类似的算法,前缀异或法。

简介

由于异或具有自反性:即任何数异或自身,结果为0。利用这个特性,我们可用于消除影响。

 a ⊕ a = 0

前缀异或的解释:对于 preXOR[i] 表示为前 i 项数的异或值。
假设我们有数组 arr: [1, 2, 3, 4, 5, 6]
前零项的异或值为: 0 = 0
前一项的异或值为: 1 = 1
前二项的异或值为: 1 ⊕ 2 = 3
前三项的异或值为: 1 ⊕ 2 ⊕ 3 = 0
前四项的异或值为: 1 ⊕ 2 ⊕ 3 ⊕ 4 = 4
前五项的异或值为: 1 ⊕ 2 ⊕ 3 ⊕ 4 ⊕ 5 = 1
前六项的异或值为: 1 ⊕ 2 ⊕ 3 ⊕ 4 ⊕ 5 ⊕ 6 = 7

因此它的前缀异或数组为 preXOR: [0, 1, 3, 0, 4, 1, 7];

现在假如我们要求第三项到第六项的前异或值,我们正常的思路应该是

3 ⊕ 4 ⊕ 5 ⊕ 6

但是应用前缀异或的思路,不用这么暴力了。因为

3 ⊕ 4 ⊕ 5 ⊕ 6 = (1 ⊕ 2) ⊕ (1 ⊕ 2 ⊕ 3 ⊕ 4 ⊕ 5 ⊕ 6) = 3 ⊕ 7

这样就可以在O(1)的时间复杂度内求出结果了。

应用

  • 1310.子数组异或查询
  • 1442.形成两个异或相等数组的三元组数目
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容