Pagini recente » Diferente pentru blog/binary-search-shortlist intre reviziile 4 si 9 | Diferente pentru problema/module intre reviziile 5 si 2 | Autentificare | Binary Search Shortlist | Diferente pentru problema/algsort intre reviziile 3 si 4
Nu exista diferente intre titluri.
Diferente intre continut:
h3. Scrierea rezultatelor
Fisierul de iesire nu va contine toate numerele afisate in ordine crescatoare deoarece dimensiunea lui ar creste foarte mult si, odata cu aceasta, si timpul de executie al programului. Astfel, cea mai mare parte a timpului alocat ar fi ocupata de scrierea informatiilor in fisier, si nu de algoritm in sine. Din acest motiv, dupa ce vectorul de numere (il vom nota cu $v$) va fi sortat, va trebui calculata si tiparita suma $S$ conform cerintei. Valoarea acestei sume poate fi foarte mare, iesind din tipurile standard de date, iar pentru calculul ei ne vom folosi de faptul ca nu avem nevoie decat de restul impartirii ei la numarul $123457$:
Fisierul de iesire nu va contine toate numerele afisate in ordine crescatoare deoarece dimensiunea lui ar creste foarte mult si, odata cu aceasta, si timpul de executie al programului. Astfel, cea mai mare parte a timpului alocat pentru executie ar fi ocupat de scrierea informatiilor in fisier, si nu de algoritm in sine. Din acest motiv, dupa ce vectorul de numere (il vom nota cu $v$) va fi sortat, va trebui calculata si tiparita suma $S$ conform cerintei. Valoarea acestei sume poate fi foarte mare, iesind din tipurile standard de date, iar pentru calculul ei ne vom folosi de faptul ca nu avem nevoie decat de restul impartirii ei la numarul $123457$:
==code(c) |
S <- 0
sfarsit pentru
==
Singurul detaliu la care trebuie sa mai avem grija este faptul ca rezultatul inmultirii $i*v[i]$ poate depasi tipul de date in care se incadreaza factorii ei (intreg cu semn pe 32 de biti). De aceea, fie va trebui sa facem o conversie explicita catre un tip intreg pe 64 de biti ($long long$ sau $int64$), fie ne vom folosi de particularitatile de limbaj sau de compilator, declarand unul dintre factorii produsului ca intreg pe 64 de biti.
Singurul detaliu la care trebuie sa mai avem grija este faptul ca rezultatul inmultirii $i*v[i]$ poate depasi tipul de date in care se incadreaza factorii ei (intreg cu semn pe 32 de biti). De aceea, fie va trebui sa facem o conversie explicita catre un tip intreg pe 64 de biti ( $long long$ sau $int64$), fie ne vom folosi de particularitatile de limbaj sau de compilator, declarand unul dintre factorii produsului ca intreg pe 64 de biti.
h3. Structura testelor
* al treilea test va contine numerele sortate in ordine descrescatoare
* al patrulea test va contine numerele in ordine aleatoare, insa vor exista putine perechi de numere distincte (foarte multe dintre numere vor aparea de mai multe ori in fisierul de intrare)
h3. Limite de timp si memorie
== include(page="template/taskfooter" task_id="algsort") ==
Limitele de timp si memorie au fost alese in asa fel incat punctajul maxim sa poata fi obtinut doar de implementari bune ale unor algoritmi de sortare eficienti atat din punct de vedere al timpului de executie (complexitatea ceruta este <tex>\mathit{O}\left( N \cdot \log N \right)</tex>), cat si din punct de vedere al memoriei suplimentare folosite (<tex>\mathit{O}\left( \log N \right)</tex> memorie suplimentara admisa).
h2. Solutie
Structura problemei cere implementarea unui 'algoritm de sortare pe baza de comparatii':http://en.wikipedia.org/wiki/Comparison_sort. Exista, de asemenea, algoritmi de sortare care nu compara explicit elementele si care au performante mai bune pentru anumite cazuri particulare ale structurii datelor de intrare; acestia nu se preteaza insa cerintelor impuse in cazul de fata.
Orice algoritm de sortare bazat pe comparatii trebuie sa efectueze, pentru a putea distinge corect toate cele <tex>N!</tex> permutari posibile ale sirului de valori, <tex>\Omega \left( N \cdot \log N \right)</tex> comparatii (o justificare a acestui rezultat se afla 'aici':http://www.cs.utexas.edu/~vlr/s07.357/notes/lb-apr5.pdf). Din aceasta perspectiva, algoritmi precum 'Merge Sort':http://en.wikipedia.org/wiki/Merge_sort, 'Heapsort':http://en.wikipedia.org/wiki/Heapsort sau 'Introsort':http://en.wikipedia.org/wiki/Introsort sunt optimi, executand <tex>\Theta \left( N \cdot \log N \right)</tex> operatii in cazul cel mai defavorabil. Dintre acestia, Merge Sort foloseste <tex>\mathit{O}\left( N \right)</tex> memorie suplimentara in implementarea clasica, deci nu se va incadra in restrictiile problemei.
Un alt algoritm de sortare foarte popular este 'Quicksort':http://en.wikipedia.org/wiki/Quicksort. Desi complexitatea sa pentru cazul cel mai defavorabil este <tex>\mathit{O}\left( N^2 \right)</tex>, in practica se comporta foarte bine si cunoaste multe imbunatatiri (detalii in prezentarea profesorului Robert Sedgewick 'aici':http://www.sorting-algorithms.com/static/QuicksortIsOptimal.pdf si a profesorului Jon Bentley 'aici':http://infoarena.ro/blog/three-beautiful-quicksorts).
In libraria standard a limbajului C este implementata o varianta Quicksort (poate fi apelata prin $qsort(...)$ - o sursa demonstrativa gasiti aici), iar STL-ul ofera programatorilor C++ functia $sort$, o implementare a algoritmului Introsort (o sursa demonstrativa aici).
Pentru mai multe detalii si un studiu comparativ al algoritmilor de sortare vizitati 'pagina Wikipedia dedicata acestui subiect':http://en.wikipedia.org/wiki/Sorting_algorithm.
== include(page="template/taskfooter" task_id="algsort") ==
Nu exista diferente intre securitate.
Topicul de forum nu a fost schimbat.