Revizia anterioară Revizia următoare
Arbori Indexati Binar
(Categoria Structuri de date, autor Giurgea Mihnea)
Abstract - Problema
Fie un vector de numere care se modifica in timp real. Ne propunem sa raspundem la query-uri de genul: "Cat este suma unei subsecventei?".
Feedback(Silviu): Un enunt ceva mai clar la problema n-ar strica. "Vector care se modifica in timp real" lasa multe semne de intrebare :) In plus, cred ca avem problema datorii care cere cam asta.
Feedback(Silviu): link de pe TC. E un punct de plecare ;)
Feedback(Cosmin): de ce nu punem direct link la articolul de pe topcoder? Pare stupid sa reinventam roata.
Raspuns(Silviu): Nu trebuie tratat foarte amplu subiectul AIB (niste explicatii pe scurt si apoi un link catre tutorialul de pe TC). Totusi, sectiunea de probleme care se rezolva cu AIB ar fi numai ea valoroasa in sine pentru ca tutorialele de pe TC dau probleme numai de pe TC :D. De fapt, asa as vrea sa tratam situatiile in care avem deja un material bun la o chestie: o introducere, niste explicatii pe scurt (eventual ce nu se acopera bine acolo) si apoi aplicatii/probleme.
Feedback(Cosmin): De acord, ma gandeam ca ar fi util chiar daca nu contine prea mult material o pagina scurta cu cateva comentarii ce completeaza articolul, oricare ar fi asta. Si ii spuneam lui mircea ca ar fi misto sa folosim chestia de comentarii de la blog. Eventual deschisa by default.
Am putea sa implementam usor un algoritm naiv de complexitate O(N), sau cu ceva efort sa folosim arbori de intervale pentru o complexitate O(logN). In continuare va vom prezenta structura de date numita AIB, usor de implementat si de aceeasi complexitate ca si arborii de intervale.
Feedback(Silviu): AIB-urile sunt chiar mai rapide decat arborii de intervale (au constanta mai mica). Merita mentionat :P
Concret - Cum?
Fie V vectorul de numere care se modifica in timp real. Vom reprezenta AIB-ul folosind un alt vector, pe care il vom denumi, sugestiv, AIB, cu urmatoarea semnificatie:
AIB[x] = suma subsecventei din V cu capetele: [x - 2 k + 1; x], unde k = numarul de 0-uri terminale din reprezentarea binara a lui x.
Indicele x | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
Inceputul subsecventei asociata lui AIB[x] | 1 | 1 | 3 | 1 | 5 | 5 | 7 | 1 | 9 | 9 | 11 | 9 | 13 | 13 | 15 | 1 |
Detalii implementare
Valoarea x - 2 k + 1, unde k = numarul de 0-uri terminale se poate calcula foarte usor astfel:
#define zeros(x) ( (x ^ (x - 1)) & x )
Aceast define va calcula valoarea 2 k pentru x, unde k = numarul de 0-uri terminale. Pentru a intelege de ce, sa luam un exemplu:
| x | 10011000 |
| x-1 | 10010111 |
| b | 00001111 |
| a | 00001000 |
x ^ (x-1)
(x ^ (x-1)) & x
To do:
+cum calc. 2^k
+implementare operatii
+complexitate timp+spatiu
+bi-dimensional
+ce altceva mai face?
+ex. probleme