给ChenZQ的树状数组

本文转载自csdn的bot(C知道),但我对文字进行了 markdownLaTeX\LaTeX 的排版


树状数组(Fenwick Tree)是一种用于高效处理区间求和问题的数据结构。它可以在 O(logn)O(\log n) 的时间复杂度内完成区间求和、单点更新等操作。

树状数组的主要思想是利用二进制表示中的低位特性来快速计算前缀和。通过维护一个长度为 nn 的数组来表示原始数组的前缀和,其中每个元素的值是对应区间的元素和。

树状数组的关键操作是通过修改某些位置的元素值来更新前缀和,以及通过查询某些位置的前缀和来完成区间求和。具体而言,对于数组中的第i个元素 aia_i,其对应的前缀和可以通过如下方式计算得到:

sumi=a1+a2+...+aisum_i = a_1 + a_2 + ... + a_i

而对于树状数组中的第 ii 个元素 BITiBIT_i,其值表示了从位置(ilowbit(i)+1i - lowbit(i) + 1)到位置 ii 的区间和。其中 lowbit(i)lowbit(i) 表示 ii 在二进制表示中最低位的 11 所对应的值。

树状数组的更新操作是通过不断将元素值累加到对应的位置上实现的。例如,要将数组中第 ii 个位置的元素增加 deltadelta,可以通过如下方式实现:

for (int j = i; j <= n; j += lowbit(j)) {
    BIT[j] += delta;
}

树状数组的查询操作是通过不断将前缀和累加起来实现的。例如,要计算数组中前 ii 个位置的区间和,可以通过如下方式实现:

int query(int i) {
    int sum = 0;
    for (int j = i; j > 0; j -= lowbit(j)) {
        sum += BIT[j];
    }
    return sum;
}

树状数组的应用非常广泛,可以用于解决一些与区间求和相关的问题,如逆序对计数、求逆序数、求解逆序数对等。它的时间复杂度相对较低,并且相对于线段树等其他数据结构而言,实现和理解都较为简单。

blog

posted @   sz_jinzikai  阅读(2)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示