# BIT：二叉索引树背后的直觉是什么？它是如何想到的？

99

4

David Harkness

2
@ DavidHarkness- Peter Fenwick发明了数据结构，因此有时将它们称为Fenwick树。在他的原始论文（位于citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.14.8917中）中，他将它们称为二进制索引树。这两个术语经常互换使用。
templatetypedef

1

1

Rockstar5645

168

``````[   ] [   ] [   ] [   ] [   ] [   ] [   ]
1     2     3     4     5     6     7
``````

``````[ 5 ] [ 6 ] [14 ] [25 ] [77 ] [105] [105]
1     2     3     4     5     6     7
``````

``````[ 5 ] [ 6 ] [21 ] [32 ] [84 ] [112] [112]
1     2     3     4     5     6     7
``````

``````Before:
[ 5 ] [ 6 ] [21 ] [32 ] [84 ] [112] [112]
1     2     3     4     5     6     7

After:
[ +5] [ +1] [+15] [+11] [+52] [+28] [ +0]
1     2     3     4     5     6     7
``````

``````             4
/     \
2       6
/ \     / \
1   3   5   7
``````

``````Before:
[ +5] [ +1] [+15] [+11] [+52] [+28] [ +0]
1     2     3     4     5     6     7

After:
4
[+32]
/     \
2           6
[ +6]       [+80]
/   \       /   \
1     3     5     7
[ +5] [+15] [+52] [ +0]
``````

• 从根（4）开始。计数器为0。
• 向左转到节点（2）。计数器为0。
• 向右转到节点（3）。计数器为0 + 6 = 6。
• 查找节点（3）。计数器是6 + 15 = 21。

• 从节点（3）开始。计数器是15。
• 向上转到节点（2）。计数器是15 + 6 = 21。
• 向上转到节点（4）。计数器是21。

``````                 4
[+32]
/     \
2           6
[ +6]       [+80]
/   \       /   \
> 1     3     5     7
[ +5] [+15] [+52] [ +0]
``````

``````                 4
[+32]
/     \
2           6
[ +6]       [+80]
/   \       /   \
> 1     3     5     7
[+10] [+15] [+52] [ +0]
``````

``````                 4
[+32]
/     \
> 2           6
[ +6]       [+80]
/   \       /   \
1     3     5     7
[+10] [+15] [+52] [ +0]
``````

``````                 4
[+32]
/     \
> 2           6
[+11]       [+80]
/   \       /   \
1     3     5     7
[+10] [+15] [+52] [ +0]
``````

``````               > 4
[+32]
/     \
2           6
[+11]       [+80]
/   \       /   \
1     3     5     7
[+10] [+15] [+52] [ +0]
``````

``````                 4
[+37]
/     \
2           6
[+11]       [+80]
/   \       /   \
1     3     5     7
[+10] [+15] [+52] [ +0]
``````

``````                100
[+37]
/     \
010         110
[+11]       [+80]
/   \       /   \
001   011   101   111
[+10] [+15] [+52] [ +0]
``````

``````              (empty)
[+37]
/     \
0           1
[+11]       [+80]
/   \       /   \
00   01     10   11
[+10] [+15] [+52] [ +0]
``````

• 节点7：111
• 节点6：110
• 节点4：100

• 节点3：011
• 节点2：010
• （节点4：100，位于左侧链接之后）

• 用二进制写出节点n。
• 将计数器设置为0。
• 当n≠0时重复以下步骤：
• 在节点n处添加值。
• 从n清除最右边的1位。

20

Anmol Singh Jaggi 2015年

2

Rockstar5645

1

DarthPaghius

3

Fenwick简单地说，询问树中每个节点的责任范围将根据其最后设置的位：