视频字幕
树状数组是一种高效的数据结构,也叫做二进制索引树。它主要用于解决数组的前缀和查询和单点更新问题。与普通数组相比,树状数组可以在对数时间内完成这些操作,大大提高了效率。
树状数组的核心是lowbit操作。lowbit函数定义为x与负x的按位与运算,即x & (-x)。这个操作能够提取出x的二进制表示中最右边的1及其后面的所有0。例如,lowbit(6)等于2,lowbit(8)等于8。这个操作是树状数组实现的基础。
树状数组的结构很特殊。每个位置i存储的不是单个元素,而是一个区间的和。具体来说,BIT[i]存储的是从i-lowbit(i)+1到i这个区间内所有元素的和。这种设计形成了一个树状的结构,使得我们可以高效地计算前缀和。
前缀和查询是树状数组的核心功能。要查询从1到i的前缀和,我们从位置i开始,不断将BIT[i]加到结果中,然后将i减去lowbit(i),直到i变为0。例如查询前缀和1到6,我们依次访问位置6和4,将对应的值相加得到结果19。整个过程的时间复杂度是O(log n)。
单点更新是树状数组的另一个重要操作。当我们要给位置i的元素增加delta时,需要更新所有包含位置i的区间。更新过程是从位置i开始,将delta加到BIT[i]上,然后将i加上lowbit(i)继续更新,直到超出数组范围。这样可以保证所有相关的前缀和都得到正确更新。
树状数组的核心是lowbit操作。lowbit函数定义为x与负x的按位与运算,即x & (-x)。这个操作能够提取出x的二进制表示中最右边的1及其后面的所有0。例如,lowbit(6)等于2,lowbit(8)等于8。这个操作是树状数组实现的基础。
树状数组的结构很特殊。每个位置i存储的不是单个元素,而是一个区间的和。具体来说,BIT[i]存储的是从i-lowbit(i)+1到i这个区间内所有元素的和。这种设计形成了一个树状的结构,使得我们可以高效地计算前缀和。
前缀和查询是树状数组的核心功能。要查询从1到i的前缀和,我们从位置i开始,不断将BIT[i]加到结果中,然后将i减去lowbit(i),直到i变为0。例如查询前缀和1到6,我们依次访问位置6和4,将对应的值相加得到结果19。整个过程的时间复杂度是O(log n)。
单点更新是树状数组的另一个重要操作。当我们要给位置i的元素增加delta时,需要更新所有包含位置i的区间。更新过程是从位置i开始,将delta加到BIT[i]上,然后将i加上lowbit(i)继续更新,直到超出数组范围。树状数组广泛应用于动态数组前缀和查询、逆序对计算、区间更新查询等问题中,是算法竞赛和实际开发中的重要工具。