Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Ajutor algoritm  (Citit de 1657 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
moon
Strain
*

Karma: -7
Deconectat Deconectat

Mesaje: 28



Vezi Profilul
« : 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.
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #1 : 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.
Memorat
truenight
Strain


Karma: 4
Deconectat Deconectat

Mesaje: 23



Vezi Profilul
« Răspunde #2 : 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)?
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #3 : 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.
« Ultima modificare: Mai 05, 2011, 14:39:20 de către George Marcus » Memorat
stocarul
Nu mai tace
*****

Karma: 49
Deconectat Deconectat

Mesaje: 203



Vezi Profilul
« Răspunde #4 : 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)
« Ultima modificare: Mai 05, 2011, 00:34:32 de către Cosmin-Mihai Tutunaru » Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #5 : 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.
Memorat
S7012MY
Nu mai tace
*****

Karma: 26
Deconectat Deconectat

Mesaje: 648



Vezi Profilul
« Răspunde #6 : 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.
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines