infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Radu Chichi din Aprilie 18, 2011, 16:16:17



Titlul: Ajutor algoritm
Scris de: Radu Chichi din Aprilie 18, 2011, 16:16:17
Puteti va rog sa-mi descrieti solutia de complexitate O(n*Logn) la aceasta problema ? Multumesc !

Citat din mesajul lui: Admitere unibuc
Un cuvânt este anagramã a altui cuvânt dacã este format din exact aceleaºi litere, aranjate într-o
altã ordine. Exemplu: caras si scara.
b) Dându-se o mulþime de n cuvinte peste alfabetul {a ,........, z}
sã se verifice dacã printre elementele mulþimii date existã anagrame.


Titlul: Răspuns: Ajutor algoritm
Scris de: George Marcus din Aprilie 18, 2011, 16:41:40
Ma gandesc ca e ceva de genul:
Pentru fiecare cuvant, ii sortezi literele componente alfabetic. Apoi, sortezi alfabetic toate cuvintele intre ele. In final, verifici daca exista cuvinte egale pe pozitii consecutive. Complexitatea O(N*logN) vine de la sortare.


Titlul: Răspuns: Ajutor algoritm
Scris de: truenight din Aprilie 18, 2011, 16:47:44
Daca am folosi un array 2D in care, pentru fiecare cuvant, retinem de cate ori se repeta fiecare litera din cuvant si dupa aia comparam, s-ar incadra in O(N*logN)?


Titlul: Răspuns: Ajutor algoritm
Scris de: George Marcus din Aprilie 18, 2011, 17:03:59
A ta e O(N*nr de litere din alfabet * log (nr de litere)) . Daca cuvintele sunt mai lungi decat numarul de litere din alfabet, atunci e mai eficienta decat solutia mea pentru ca ai de facut mai putine comparatii la sortare. Insa, pentru stringuri exista functii predefinite, deci e mai comod.


Titlul: Răspuns: Ajutor algoritm
Scris de: Cosmin-Mihai Tutunaru din Mai 05, 2011, 00:25:54
Ma gandesc ca e ceva de genul:
Pentru fiecare cuvant, ii sortezi literele componente alfabetic. Apoi, sortezi alfabetic toate cuvintele intre ele. In final, verifici daca exista cuvinte egale pe pozitii consecutive. Complexitatea O(N*logN) vine de la sortare.

Vezi că soluţia ta are o complexitate O(N * lngCuvânt * (log(N) + log(lngCuvânt))

Compararea a două cuvinte nu se face în timp constant. Se face în O(lungimeCuvânt)


Titlul: Răspuns: Ajutor algoritm
Scris de: George Marcus din Mai 05, 2011, 14:42:38
Da, ai dreptate. Eu am considerat ca se poate neglija lungimea cuvantului, iar daca e prea mare atunci se trece la cealalta varianta.


Titlul: Răspuns: Ajutor algoritm
Scris de: Petru Trimbitas din Mai 05, 2011, 14:47:26
Puteti va rog sa-mi descrieti solutia de complexitate O(n*Logn) la aceasta problema ? Multumesc !

Citat din mesajul lui: Admitere unibuc
Un cuvânt este anagramã a altui cuvânt dacã este format din exact aceleaºi litere, aranjate într-o
altã ordine. Exemplu: caras si scara.
b) Dându-se o mulþime de n cuvinte peste alfabetul {a ,........, z}
sã se verifice dacã printre elementele mulþimii date existã anagrame.


Pentru fiecare cuvant il sortezi si il bagi intr-un hash. Daca il mai gasesti in hash inseamna ca ai anagrama.