Fenwick tree ( binární indexovaný strom , anglicky Fenwick tree , binární indexovaný strom , BIT) je datová struktura , která umožňuje rychle měnit hodnoty v poli a najít některé funkce z prvků pole. Poprvé popsal Ryabko B.Ya. v roce 1989. [1] Plná verze, kterou publikoval v angličtině v roce 1992. [2]
O dva roky později (v roce 1994) se objevil článek P. Fenwicka [3] , kde byla popsána stejná struktura, později nazvaná "Fenwick tree".
Pro přirozené číslo budeme označovat maximálního dělitele , což je mocnina dvou (za jednotku považujeme i mocninu dvou). Je snadné vidět, že F ( n )= n −( n & ( n − 1)), kde & je bitový AND dvou celých čísel. Nechť naše pole má prvky: . Vybíráme pro které . K uložení stromu Fenwick pak potřebujete řadu prvků . Očíslujeme je od 1 do . Buňka uloží součet do buněk pole od do .
Fenwickův strom pro součet podporuje 2 operace:
1) upravit pomocí argumentů a — změnit hodnotu -té buňky pole na číslo ( může být kladné nebo záporné).
2) počítat s argumentem - najít součet čísel v buňkách pole od 1. do tis.
Obě operace lze snadno realizovat v jednom cyklu.
upravit(N,X)
jeden) | i=N |
2) | Zatímco i≤ |
2.1) | Zvětšit b[i] o X |
2.2) | Zvýšit i o F(i) |
počet (N)
1) res=0
2) i=N
3) Nashledanou
3.1) Zvyšte res o b[i]
3.2) Snížit i o F(i)
4) Odpověď = res
Složitost obou operací je O(k) = O(log n). Stojí za zmínku, že pomocí operace count(N) můžeme obecně najít součet na libovolném segmentu se stejnou složitostí, protože pro ≠1 je přesně roven .
Fenwickův strom pro maximum podporuje následující operace:
1) upravte pomocí argumentů a — pokud je hodnota v th buňce pole menší než , napište do ní číslo . Jinak ponechte hodnotu tak, jak je.
2) počítejte s argumenty a - najděte maximální počet v buňkách pole od -th do -th.
K uložení stromu kromě pole pole použijeme pole a . V té buňce pole uložíme maximum na segment ; v th buňce pole - maximum na segmentu v a na segmentu v .
Následuje realizace operací.
upravit(N,X)
1)a[N]=max(a[N],X)
2)i=N
3) Nashledanou
3.1)levý[i]=max(levý[i],X)
3.2) Zvýšit i o F(i)
4)j=N
5) Nashledanou
5.1)vpravo[j]=max(vpravo[j],X)
5.2) Snížit j o F(j)
počet (L,R)
1) rozlišení = 0
2)i=L
3) Nashledanou
3.1)res=max(res,right[i])
3.2) Zvýšit i o F(i)
4)res=max(res,a[i])
5)j=R
6) Nashledanou
6.1)res=max(res,left[j])
6.2) Snížit j o F(j)
7) Odpověď = res
Složitost operací = .
Všimněte si, že pomocí Fenwickova stromu pro maximum nemůžete snížit hodnotu zaznamenanou v buňce. Pokud chcete, aby vaše datová struktura měla tuto schopnost, měli byste maximálně použít řezací strom .
Operace lze jednoduše upravit tak, aby Fenwickův strom našel nejen hodnotu maxima, ale i buňku, ve které je tohoto maxima dosaženo.
Strom (datová struktura) | |
---|---|
Binární stromy | |
Samovyrovnávací binární stromy |
|
B-stromy |
|
předponové stromy |
|
Binární dělení prostoru | |
Nebinární stromy |
|
Rozbití prostoru |
|
Jiné stromy |
|
Algoritmy |
|