पाठ 15 / 42
Fenwick Tree (BIT)
Prefix sums और point updates के लिए compact array-based structure, O(log n) में, segment tree से सरल।
तरकीब
Binary Indexed Tree (Fenwick tree) आंशिक sums को उन indices पर रखता है जो i के सबसे कम set bit से चुने जाते हैं। Index i, i & (-i) आकार की range के लिए ज़िम्मेदार होता है। इससे update और prefix-sum दोनों केवल एक array से O(log n) में चलते हैं।
Update और prefix sum
update i & -i जोड़ते हुए ऊपर जाता है; prefix_sum इसे घटाते हुए नीचे जाता है। Range sum है prefix_sum(r) - prefix_sum(l-1)।
bit = [0] * (n + 1)
def update(i, delta):
while i <= n:
bit[i] += delta
i += i & (-i)
def prefix_sum(i):
s = 0
while i > 0:
s += bit[i]
i -= i & (-i)
return s
def range_sum(l, r):
return prefix_sum(r) - prefix_sum(l - 1)
Output:
update(3, 5) range_sum(1, 3) # includes the +5 at index 3
Fenwick बनाम segment tree
Fenwick tree लिखने में छोटा है और आधी memory लेता है, पर स्वाभाविक रूप से केवल prefix-reducible operations (जैसे sum/xor) को support करता है। Segment tree min/max/gcd और range updates तक सामान्यीकृत होता है — sum के लिए Fenwick चुनें, बाकी के लिए segment tree।
त्वरित जांच
सही time complexity चुनें।
त्वरित जाँच: Fenwick tree के update और prefix-sum operations चलते हैं:
- O(1)
- O(log n)
- O(n)
- O(n log n)
Answer
O(log n) — दोनों index को सबसे कम set bit बदलते हुए ऊपर/नीचे जाते हैं, O(log n) चरणों में।