Fenwick tree ( binary indexed tree , engelska Fenwick tree, binary indexed tree , BIT) är en datastruktur som låter dig snabbt ändra värden i en matris och hitta några funktioner från matriselement. Först beskrevs av Ryabko B.Ya. år 1989. [1] Full version publicerad av honom på engelska 1992. [2]
Två år senare (1994) dök en artikel av P. Fenwick [3] upp , där samma struktur beskrevs, senare kallad "Fenwick-trädet".
För ett naturligt tal kommer vi att beteckna den maximala divisorn , som är en potens av två (vi anser också att enheten är en potens av två). Det är lätt att se att F ( n )= n −( n & ( n − 1)), där & är bitvis OCH av två heltal. Låt vår array ha element: . Vi väljer för vilket . Sedan, för att lagra Fenwick-trädet, behöver du en rad element . Vi kommer att numrera dem från 1 till . Cellen kommer att lagra summan i cellerna i arrayen från till .
Fenwick-trädet för summan stöder 2 operationer:
1) modifiera med argument och — ändra värdet på den -th cellen i arrayen till ett tal ( det kan vara antingen positivt eller negativt).
2) räkna med ett argument - hitta summan av siffror i cellerna i arrayen från 1:a till th.
Båda operationerna kan enkelt implementeras i en cykel.
modifiera(N,X)
ett) | i=N |
2) | Medan i≤ |
2.1) | Öka b[i] med X |
2.2) | Öka i med F(i) |
räkna(N)
1) res=0
2) i=N
3) Hejdå
3.1) Öka res med b[i]
3.2) Minska i med F(i)
4) Svar = res
Komplexiteten för båda operationerna är O(k) = O(log n). Det är värt att notera att med hjälp av count(N)-operationen kan vi generellt hitta summan på vilket segment som helst för samma komplexitet, eftersom det för ≠1 är exakt lika med .
Fenwick-trädet för maximalt stöder följande operationer:
1) modifiera med argument och — om värdet i den :e cellen i arrayen är mindre än , skriv sedan ett tal till den . Lämna annars värdet som det är.
2) räkna med argument och - hitta det maximala antalet i cellerna i arrayen från -th till -th.
För att lagra trädet kommer vi , förutom arrayen , att använda arrayer och . I den e cellen i arrayen kommer vi att lagra maximum på segmentet ; i arrayens :e cell - det maximala på segmentet vid och på segmentet vid .
Nedan följer genomförandet av verksamheten.
modifiera(N,X)
1)a[N]=max(a[N],X)
2)i=N
3) Hejdå
3.1)vänster[i]=max(vänster[i],X)
3.2) Öka i med F(i)
4)j=N
5) Hejdå
5.1)höger[j]=max(höger[j],X)
5.2) Minska j med F(j)
räkna(L,R)
1)res=0
2)i=L
3) Hejdå
3.1)res=max(res,höger[i])
3.2) Öka i med F(i)
4)res=max(res,a[i])
5)j=R
6) Hejdå
6.1)res=max(res,vänster[j])
6.2) Minska j med F(j)
7) Svar = res
Operationernas komplexitet = .
Observera att om du använder Fenwick-trädet som maximum kan du inte minska värdet som registreras i cellen. Om du vill att din datastruktur ska ha denna förmåga, bör du använda ett skärningsträd för maximalt.
Operationerna kan enkelt modifieras så att Fenwick-trädet hittar inte bara värdet av maximivärdet, utan även cellen där detta maximum uppnås.
Träd (datastruktur) | |
---|---|
Binära träd | |
Självbalanserande binära träd |
|
B-träd | |
prefix träd |
|
Binär uppdelning av utrymme | |
Icke-binära träd |
|
Bryter upp utrymmet |
|
Andra träd |
|
Algoritmer |