يجيب شجرة القطاع وشجرة Fenwick (Binary Indexed Tree، BIT) على استعلامات النطاق (مثل مجموع [l, r]) والتحديثات النقطية في O(log n)، مقابل O(n) للمسح الساذج أو تحديثات O(n) لمصفوفة البادئة.
يجيب شجرة القطاع وشجرة Fenwick (Binary Indexed Tree، BIT) على استعلامات النطاق (مثل مجموع [l, r]) والتحديثات النقطية في O(log n)، مقابل O(n) للمسح الساذج أو تحديثات O(n) لمصفوفة البادئة.
Array + many "sum of range [l,r]" and "update index i" calls:
naive prefix sums: query O(1) but UPDATE is O(n)
segment/Fenwick: query O(log n) AND update O(log n)
class Fenwick:
def __init__(self, n):
self.t = [0]*(n+1)
def update(self, i, delta): # O(log n)
i += 1
while i < len(self.t):
self.t[i] += delta
i += i & (-i) # jump to next responsible node
def prefix(self, i): # sum of [0..i], O(log n)
i += 1; s = 0
while i > 0:
s += self.t[i]
i -= i & (-i)
return s
def range_sum(self, l, r):
return self.prefix(r) - self.prefix(l-1)
تخزن شجرة القطاع مجموع متراكم لكل قطاع مصفوفة في شجرة ثنائية، وتدعم أي عملية ترابطية (مجموع، حد أدنى، حد أقصى، gcd) وأيضًا، مع الانتشار الكسول، تحديثات النطاق أيضًا.
[0..7] sum
/ \
[0..3] [4..7]
/ \ / \
[0..1][2..3] [4..5][6..7] ... down to single elements
| Fenwick (BIT) | شجرة القطاع | |
|---|---|---|
| الاستعلام / التحديث | O(log n) | O(log n) |
| المساحة | O(n) | O(2n) |
| العمليات | مجاميع (قابلة للعكس) | أي عملية ترابطية |
| تحديثات النطاق | أصعب | سهل (الانتشار الكسول) |
| حجم الكود | صغير جدًا | أكبر |
تجعل هذه الهياكل "تحديث قيمة، ثم الاستعلام عن مجموع على نطاق" سريعًا — وهذا ضروري للبرمجة التنافسية ونوافذ التحليلات ومشاكل الفترات.
الاختيار بينهما هو مقايضة: شجرة Fenwick صغيرة وسريعة للمجاميع، بينما شجرة القطاع أكثر مرونة لأحمال العمل min/max/تحديثات النطاق.