infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva educationala => Subiect creat de: Filip Cristian Buruiana din Februarie 27, 2008, 20:26:50



Titlul: 011 Generare de permutari
Scris de: Filip Cristian Buruiana din Februarie 27, 2008, 20:26:50
Aici puteţi discuta despre problema Generare de permutari (http://infoarena.ro/problema/permutari).


Titlul: Răspuns: 011 Generare de permutari
Scris de: Bozianu Ana din Februarie 27, 2008, 21:53:48
O idee alternativa este generarea iterativa.
 O scurta descriere :
Fie p[1],p[2],...p[n] o permutare data.
1. Se cauta din coada prima pozitie de crestere adica adica
p[ i ]<p[ i+1 ] ( 1<= i  < n ) i=maxim
2. Se cauta din coada prima pozitie j pentru care in care p[ j ] > p[ i ] .
3. Se schimba intre ele elementele din pozitiile i si j .
4. Se reverseaza secventa  i+1 -> n.
Astfel se genereaza permutarea urmatoare in ordine lexicografica


Titlul: Răspuns: 011 Generare de permutari
Scris de: Mircea Pasoi din Februarie 27, 2008, 22:09:20
Ceva asemanator face si next_permutation in STL. Cred ca ar trebuie mentionata si solutia asta in indicatii. O alta posibilitate mai e sa iei fiecare numar de la 1 la N! si sa determine ce permutare reprezinta.


Titlul: Răspuns: 011 Generare de permutari
Scris de: Bozianu Ana din Februarie 27, 2008, 22:25:22
Dap. Scazand factoriale in ordine descrescatoare.


Titlul: Răspuns: 011 Generare de permutari
Scris de: Adrian Diaconu din Februarie 27, 2008, 22:33:07
Trebuia mentionata si solutia cu dancing links.


Titlul: Răspuns: 011 Generare de permutari
Scris de: Filip Cristian Buruiana din Februarie 27, 2008, 22:36:30
Cred ca cel mai bine cand vine cineva cu o solutie noua e sa adauge el la indicatii de rezolvare, asa e greu sa te gandesti din prima la toate solutiile :roll:. Adica problemele pot fi modificate si pe parcurs, dupa ce ies la rampa. In plus, daca mai stiti probleme similare care folosesc algoritmii prezentati, completati ca sa obtinem o lista cat mai buna.


Titlul: Răspuns: 011 Generare de permutari
Scris de: Bogdan-Cristian Tataroiu din Februarie 28, 2008, 09:24:37
Cred ca cel mai bine cand vine cineva cu o solutie noua e sa adauge el la indicatii de rezolvare, asa e greu sa te gandesti din prima la toate solutiile :roll:. Adica problemele pot fi modificate si pe parcurs, dupa ce ies la rampa. In plus, daca mai stiti probleme similare care folosesc algoritmii prezentati, completati ca sa obtinem o lista cat mai buna.

Nu trebuie sa fii decat admin :P Se poate face o noua pagina /problema/nume/indicatii care sa fie editabila de oricine si inclusa in problema.


Titlul: Răspuns: 011 Generare de permutari
Scris de: Vladimir Oltean din Martie 02, 2008, 12:28:59
Am postat solutia folosind si backtracking, si generarea permutarii urmatoare, dar totusi imi iese din timp la ultimul test. de ce? :fool:


Titlul: Răspuns: 011 Generare de permutari
Scris de: Bunau Florin din Martie 02, 2008, 12:38:24
@vlad_oltean
Fa scrierea si citirea in C, si scrie functia afis()  inline.


Titlul: Răspuns: 011 Generare de permutari
Scris de: Vladimir Oltean din Martie 02, 2008, 14:57:22
Fa scrierea si citirea in C, si scrie functia afis()  inline.

multumesc pentru sfat, am modificat si am luat si eu suta :thumbup: dar oricum, de ce stdio merge mai repede decat fstream??  :-s


Titlul: Răspuns: 011 Generare de permutari
Scris de: Bunau Florin din Martie 02, 2008, 17:52:35
sorry mods, nu e chiar ontopic
@vlad_oltean
Actualy nu e stdin si fstream :P astea sunt headere, care contin definitiile functiilor de citire.

Nu intodeuna citirile in C sunt mai rapide decat cele in C++.
Toate depind de implementarea lor data de compilator. Depinde de ce flaguri de compilare folosesti,
depinde de ce optimizari mai ai in cod etc..
Sa nu repet familia de functii de citire in C si C++, am sa ma refer la scanf si cin.
Nu poti zice cu siguranta ca "scanf" e mai rapida decat "cin" sa zicem.
Oricum in cazul asta si in majoritatea cazurilor unde folosesti direct functiile, diferenta de viteza e in fravoarea scanf clar.
Provine de la faptul ca cin e un obiect de tip istream, care trebuie construit, distrus, manipulat, e mare.. in fine.. e un obiect si se misca mai greu (object overhead). Bineinteles cum se misca de optimizarile compilatorului. "scanf" nu foloseste obiecte ci e o functie caruia ii dai un pattern de citire si niste pointeri, acesul in memorie se face mai rapid in cazul asta.
Niste linkuri pe tema asta:

http://forums.topcoder.com/?module=Thread&threadID=508058&start=0&mc=7
http://www.cplusplus.com/reference/iostream/
Ah si discutia prea funny in care brahle e cam owned pe subiectul asta :)
http://www.daniweb.com/forums/thread40450.html


Titlul: Răspuns: 011 Generare de permutari
Scris de: Cosmin Negruseri din Martie 03, 2008, 00:54:30
Ar merge un articol in care se discuta chestiile astea.


Titlul: Răspuns: 011 Generare de permutari
Scris de: Chibici Tiberiu din Aprilie 17, 2009, 09:03:20
Am facut problema cu next_permutation din STL. Cu streamuri (pe calcul meu) compilatorul MinGW spunea ca executia a durat 0.5 secunde, cu stdio doar 0.2 secunde.


Titlul: ifstream si ofstream mai rapide decat freopen
Scris de: Soucup Nicolae Silviu din Noiembrie 27, 2012, 08:14:55
Cu ifstream si ofstream (68ms testul 5 pentru N=8) merge mai repede decat cu freopen (80ms testul 5 pentru N=8)


Titlul: Răspuns: 011 Generare de permutari
Scris de: George Popoiu din Noiembrie 27, 2012, 08:54:03
WOOW !  :shock: Pe bune ?!?


Titlul: Răspuns: 011 Generare de permutari
Scris de: CHIRILA ADRIAN din Noiembrie 10, 2013, 16:49:09
Ce complexitate are functia  next_permutation? O(1)?


Titlul: Răspuns: 011 Generare de permutari
Scris de: Rares Cheseli din Noiembrie 10, 2013, 18:05:49
http://www.cplusplus.com/reference/algorithm/next_permutation/


Titlul: Răspuns: 011 Generare de permutari
Scris de: Puscas Sergiu din Noiembrie 10, 2013, 18:06:09
"Up to linear in half the distance between first and last (in terms of actual swaps)." (http://www.cplusplus.com/reference/algorithm/next_permutation/ (http://www.cplusplus.com/reference/algorithm/next_permutation/))

Deci O(N/2), care poate fi aproximat la O(1) (pentru N <=8).


Titlul: Răspuns: 011 Generare de permutari
Scris de: Stefan din Mai 09, 2018, 15:04:45
https://infoarena.ro/job_detail/2202619?action=view-source

80 puncte, fail pe ultimul test.
Any ideas?  :)