Pozdrav,
Radim neku igru i tokom igre treba obradjivati VELIK broj upita raznih tipova.
Imate relativno velik niz brojeva, u najgorem slucaju moze imat 10000 elemenata, svakih ~10 sekundi stigne oko 1000000 (10^6) upita.
Upiti mogu bit ovog tipa, poredani po ucestalosti:
1) Koji je najveci broj u intervalu [x, y], dakle na indeksima x, x+1, x+2 ... y, koji je najveci broj, odnosno kako to moje naivno rjesenje radifor(int i = x; i <= y; i++) m = max(m,a[i]);
2)Koliko postoji negativnih brojeva na intervalu [x, y], moje naivno rjesenje for(int i = x; i <= y; i++) c += (a[i]<0);
3)Umetni neki broj ne neko mjesto.
4) Neki interval premjesti na kraj niza. da upit kaze, (2, 4), i imamo niz brojeva, 1, 2, 3, 4, 5, 6. Tada interval 1, | 2, 3, 4, | 5, 6, premjestimo na kraj == > 1, 5, 6, 2, 3, 4
5) Izbrisi broj sa neke pozicije. (tada se dva preostala dijela spoje)
Buduci da za obradu svakog od ovih slucajeva meni treba O(n) operacija, program mi na momente zbilja sporo radi, jer ceka obradu.
Prijatelj mi je sugerirao kako upit drugog tipa odgovoriti u O(1). Tj. da posumiram broj negativnih brojeva, i imam niz broj[x], odnosno koliko je negativnih bilo od pocetka do x. Tada je broj negativnih u intervalu broj[y] - broj[x-1]. Al svaki put kad napravim neki od ostala dva upita, moram jos O(n) operacija napravit da bi mogao to ponovno koristit.
Molim vas, bilo kakve prijedloge o ubrzanjima mi recite, ili sugerirajte kako nesto pravilno i pametno napraviti.
Hvala