Fenvik stablo
Fenvik stablo ili binarno indeksno stablo je struktura podataka koja nam omogućava efikasno izračunavanje i manipulaciju prefiksnih suma sa vec izračunatim vrednostima koji ova struktura nudi. Ovu strukturu je predlozio Piter Fenwick 1994. godine [1] Fenvik Stablo prvenstveno rešava problem prefiksne sume i modifikacije elemenata u vrlo efikasnom vremenu. Postoji mogućnost da sami izračunamo tablu prefiksnu sume gde bi kompleksnost tok izračunavanja bila a čitanje iz tabele ,ali problem nastaje kada se od nas zahteva da modifikujemo neki element u tabeli. Fenvik stablo računa prefiksne sume i modifikaciju tabele u vremenu, gde je veličina tabele.
Opis
[уреди | уреди извор]Ako vam je zadat neki niz vrednosti, ponekad je neophodno izračunati ukupnu sumu tih vrednosti od nekog indeksa do drugog asocijativno. Fenvikno stablo omogućava metodu podelе ukupnih vrednosti svakog indeksa, kao i izmenu tih vrednosti nakon neke veće promene u nizu koje bi uticali na odgovarajuću vrednost. U praksi ova struktura je implementirana korišćenjem niza analognim implementaciji Binarnog hipa. Svaki indeks u nizu predstavlja neki čvor, indeks nekog od ćvorova roditelja ili deteta se računa preko bitwise operacija nad binarnom sistemu. Svaki indeks sadrži već izračunatu sumu iz nekog dela tabele, kombinacijom te sume kao i sa vrednostima čvorova tokom prolaženja do korena stabla, prefiksna suma biva izračunata. Kad se promeni neka vrednost u nizu, svi delovi sume koji sadrže modifikovanu vrednost su izmenjena sličnim prolazom kroz drvo. Sve modifikacije stabla su izvršene u asimptotskom vremenu jednakom - u najgorem slučaju.
Proces izgradnje Fenvik stabla preko već nekog niza se izvršava u vremenu. Druge efikasne metode uključuju lociranje indeksa vrednosti ako su sve vrednosti pozitivne, ili ako su sve vrednosti negativne. Takođe postoji mogućnost izračunavanja sume nekog pod niza, a rešenje toga je oduzimanje prefiksne sume do desnog kraja trazenog indeksa sa prefiksnom sumom levog indeksa - 1 .
Aplikacije
[уреди | уреди извор]Fenvik stablo je korišćeno da implementira aritmetičko kodiran algoritam.
Korišćenjem ovog stabla veoma lako je izgenerisati kumulativne sume neke liste. Iz kumulativne tabele je moguće izračunati zbir frekvencija u odredjenom segmentu u kompleksnosti.
Fenvik stablo se takodje može koristiti za izračunavanje sume i dodele novim vrednostima multi dimenzionalnim nizovima gde je kompleksnost ovakvih operacija , d je broj dimenzija a n je broj elemenata duž svake dimenzije. [2]
Implementacija
[уреди | уреди извор]Ovo je primer programa koji implementira binarno indeksno stablo napisano u programskom jeziku C.
#include<stdio.h>
#include<stdlib.h>
#define N 5 //definisemo velicinu niza
int niz_unosa[N]; //definisemo niz
void izmeni_stablo(int *stablo,int indeks,int vrednost){
while(indeks<=N){
stablo[indeks]+=vrednost;
indeks+=indeks&(-indeks); //formula za prolazenje kroz BIT kada izmenjujemo vrednosti
}
}
int *napravi_stablo(){
int *stablo = (int*)malloc(sizeof(N*sizeof(int))); //deklarisemo dinamcki niz koji ce predstavljati BIT
for(int i=0;i<=N;i++){
stablo[i]=0; //deklarisemo sve vrednosti na 0
}
for(int i=0;i<N;i++){
izmeni_stablo(stablo,i+1,niz_unosa[i]); //koriscenjem funkcije koja izmenjuje stablo mi pravimo stablo,kompleksnost O(N*LOGn)
}
return stablo; // vracamo novo-kreirano stablo
}
int stampaj_sumu(int *stablo,int indeks){
int s=0;
while(indeks){
s+=stablo[indeks];
indeks-=indeks&(-indeks); //formula za prolazenje kroz BIT kada stampamo sumu
}
return s;
}
int main(){
niz_unosa[0]=5;
niz_unosa[1]=15;
niz_unosa[2]=3;
niz_unosa[3]=9;
niz_unosa[4]=42;
int *stablo = napravi_stablo();
printf("%d ",stampaj_sumu(stablo,3)); // stampamo sumu prva 3 elementa. REZULTAT = 23
printf("%d",stampaj_sumu(stablo,5) - stampaj_sumu(stablo,3)); //stampamo sumu pod niza gde je levi kraj na indeksu 4 a desni na indeksu 5 . REZULTAT = 51
}
Vidi još
[уреди | уреди извор]Reference
[уреди | уреди извор]- ^ Peter M. Fenwick (1994). „A new data structure for cumulative frequency tables”. Software: Practice and Experience. 24 (3): 327—336. doi:10.1002/spe.4380240306.
- ^ Pushkar Mishra (2013). „A New Algorithm for Updating and Querying Sub-arrays of Multidimensional Arrays”.