美文网首页
python异或高阶应用-前缀异或法

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

作者: wanzhouyi | 来源:发表于2021-05-18 22:52 被阅读0次

    前言

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

    简介

    由于异或具有自反性:即任何数异或自身,结果为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.形成两个异或相等数组的三元组数目

    相关文章

      网友评论

          本文标题:python异或高阶应用-前缀异或法

          本文链接:https://www.haomeiwen.com/subject/lqhujltx.html