应用于按位与的二进制索引树

Posted

技术标签:

【中文标题】应用于按位与的二进制索引树【英文标题】:Binary index tree applied to bitwise AND 【发布时间】:2014-10-28 17:52:50 【问题描述】:

我想知道是否可以使用二叉索引树(BIT)来实现按位与的范围查询(而不是通常使用范围求和)?

这是我更新部分的代码:

memset(BIT,1<<20-1,sizeof(BIT));
void update(int idx)
    while(idx<=n)
        BIT[idx] &= a[idx];
        idx += idx&(-idx);
    

谁能告诉我是否可以为查询部分编写代码?据我所知,范围总和查询类似于:

int query(int idx)
    int res = 0;
    while (idx)
        res += BIT[idx];
        idx -= idx&(-idx);
    
    return res;

要查询[a,b]的和,答案是query(b)-query(a-1)。如何将其修改为按位 AND 范围查询?

【问题讨论】:

【参考方案1】:

这是不可能的(至少只使用一个 BIT)。原因很简单:如果您知道前缀a - 1 和前缀b 的按位与,则不可能唯一确定[a, b] 范围的按位与。例如,如果query(0)1 并且query(1)1,则query(1, 1)(即索引为1 的元素)的答案可以是任何不能被2 整除的数字.

我建议改用分段树。

【讨论】:

【参考方案2】:

要扩展user2040251's answer,如果您有兴趣,可以使用几个二叉索引树来实现。

考虑一点。当且仅当某个范围内的总和等于该范围的大小时,该范围内的 AND 将为 1(否则为 0,因为该范围内至少有一个事物必须为 0)。

所以你需要一个 BIT 一个位,每个位需要两个查询,所以总而言之它的效果不是很好,但它确实有效。

【讨论】:

谢谢哈罗德。您能否展示一些示例代码来说明这个 2d BIT?谢谢 @ChuNan 它只是一个 BIT 数组(二维 BIT 更复杂)。因此,您将有一个 BIT 来处理您存储的整数的所有最低有效位,一个 BIT 用于第二位,依此类推。它们中的每一个都完全按照您的预期工作,您现在拥有的更多。

以上是关于应用于按位与的二进制索引树的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode Java刷题笔记—201. 数字范围按位与

java各种运算符

《LeetCode之每日一题》:204.数字范围按位与

&= 的含义

应用按位与操作,分离字节

python中的按位与 +按位或+ 按位反+异或运算 +左移+右移