infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Macarescu Sebastian din Ianuarie 12, 2015, 16:54:44



Titlul: Optimizare problema arbori
Scris de: Macarescu Sebastian din Ianuarie 12, 2015, 16:54:44
Salut. As vrea sa stiu daca problema urmatoare are alta solutie mai optima:

Fie un arbore. Initial toate nodurile au aceeasi valoare, mostenite de la radacina. Se fac urmatoarele operatii pe arbore:
1. nodul x ia valoarea y, caz in care toate nodurile din subarborele cu radacina in x care il mostenesc iau valoarea y.
2. seteaza nodul x sa mosteneasca parintele (caz in care se poate modifica valoarea nodului x => operatia 1)
3. aflarea valorii nodului x

Prima solutie care imi vine in minte este ca pentru operatia 1 si 2 sa parcurg subarborele si sa setez valorile, iar aflarea valorii unui nod sa fie in O(1). Exista o solutie mai eficienta, atat din pt de vedere al timpului cat si al memoriei ?
Multumesc anticipat.


Titlul: Răspuns: Optimizare problema arbori
Scris de: George Marcus din Ianuarie 13, 2015, 16:25:33
E destul de ciudat enuntul, sper ca am inteles bine problema. Presupun ca daca A il mosteneste pe B si B pe C atunci si A pe C.

O solutie mai buna ar fi sa imparti cele M query-uri in bucati de sqrt(M). Pentru fiecare bucata, calculezi vectorul S[i] = stramosul cu nivelul minim pe care il mosteneste (cel mai de sus). Apoi, operatiile se fac astfel:

2. O(1), pur si simplu marchezi.
1. O(1), marchezi la nodul x ca la query-ul cu indexul i i s-a atribuit valoarea y.
3. Ai lista L de noduri ale caror valoare s-a schimbat (maxim sqrt(M)). Mergi din x pana in stramosul cu nivelul minim (posibil diferit de S[i]) in maxim sqrt(M) pasi si de fiecare data cand treci pe langa un nod din L vezi cu ce valoare a contribuit la x.

Iese complexitatea O(N*sqrt(M) + M*sqrt(M)).


Titlul: Răspuns: Optimizare problema arbori
Scris de: Macarescu Sebastian din Ianuarie 13, 2015, 22:02:27
Ai inteles bine enuntul. Insa problema e ca acele queryuri sunt intercalate. Sunt N operatii care pot fi de tipul 1,2 sau 3, lucru pe care am uitat sa il specific  ](*,)


Titlul: Răspuns: Optimizare problema arbori
Scris de: George Marcus din Ianuarie 13, 2015, 23:02:40
Solutia mea tine cont de asta.


Titlul: Răspuns: Optimizare problema arbori
Scris de: Macarescu Sebastian din Ianuarie 13, 2015, 23:15:25
Atunci nu am inteles eu solutia ta. Cum pot sa impart queryurile in bucati de sqrt de M daca nu le cunosc numarul? Tot ce stiu este ca sunt N operatii care trebuie executate in ordine.


Titlul: Răspuns: Optimizare problema arbori
Scris de: George Marcus din Ianuarie 14, 2015, 00:57:42
Ok, posibil sa ma fi exprimat gresit. Prin query ma refeream la operatii. N operatii (la tine) = M query-uri (la mine).


Titlul: Răspuns: Optimizare problema arbori
Scris de: Macarescu Sebastian din Ianuarie 14, 2015, 08:26:21
Ideea pare buna insa nu stiu daca se mai poate implementa daca problema este interactiva (numarul de operatii nu este cunoscut de la inceput)  :-k


Titlul: Răspuns: Optimizare problema arbori
Scris de: Adrian Budau din Ianuarie 15, 2015, 04:47:28
Ba merge. Faci in O(sqrt(N)) unde N e marimea initiala a arborelui. In rest ramane aceeasi solutie. Defapt e cel mai bine sa faci asa si n in bucati de O(sqrt(M)) pentru ca asa complexitatea devine O(M sqrt(N)) in loc de O(M sqrt(M)). In rest e super buna solutia lui @George Marcus.


Titlul: Răspuns: Optimizare problema arbori
Scris de: Macarescu Sebastian din Ianuarie 17, 2015, 20:26:12
Ok. Multumesc mult de solutie :)