Date: | Mon, 19 Mar 2001 16:36:08 -0500 (EST) |
From: | Mihai Badoiu <mihai@MIT.EDU> | Block Address | Add to Address Book |
To: | Mihai Patrascu <mihai_p@pcnet.ro> |
CC: | probleme <probleme@ldc.ro> |
Subject: | Re: re la diverse |
|
|
Ok, se pare ca nu am dat exemplul cel mai potrivit. (prea multe solutii
diferite care merg) Ideea este in felul urmator (baga la cap ca o sa-ti
foloseasca):
Ideea este sa foloseshti RANDOM. Permutezi elementele random si apoi
faci
un mic qsort (original). De ce merge? Pai qsort ia timp O(n lg n) cu
probabilitate mare (cel putin n-1/n). Cum ai randomizat inputul o sa fi
sigur ca pt orice test timpul o sa fie ok (adica c*n lg n) si o sa-ti
mearga ok si pe testul care probabil ca e facut ca qsort sa ia n^2.
Daca faci calculul, o sa vezi ca constantele ies bine. Poti sa
implementezi asa ceva foarte repede in timp de concurs si poti sa fi
sigur
(cu probabilitate cel putin 1-1/1M la testul mare) ca o sa-ti mearga.
Ideea este foarte importanta si foarte folositoare la concurs. Sunt
multe
probleme la care timpul cel mai rau este mai mic cu un factor de cel
putin
c*n/lg n timpul mediu. Bine, la olimpiada poate ca nu ai timp sa
demonstrezi, dar o intuitie tot ai. Cand iti dai seama ca algoritmul
tau
merge mai bine pe cazul mediu, considera ce se intampla daca
randomizezi
inputul.
Termenul de "chaos from order" chiar exista si se refera exact la ideea
asta, bine aplicata la demonstratii probabilistice. Informatica e cea
care
imprumuta din alte domenii...
ps O sa raspund la alte eventuale mesaje la sfarsitul saptamanii.
--mihai
On Mon, 19 Mar 2001, Mihai Patrascu wrote:
> ==========================
> === Chaos from order
>
> Well, well... Dupa cum e formulata problema, presupun ca vrei sa afli
daca
> membrii listei stiu sa faca un merge sau un qsort calumea
(median-of-three,
> optimizarile alea pentru stiva O(lgN) etc.). Eu personal raman la
preferinta
> mea pentru heapsort la concurs, dar pe 1M merge probabil groaznic,
deoarece
> nenoroceste cache-ul procesorului (pe de alta parte quick si merge
sunt
> foarte localizate). Despre regula cu max 40 de linii, poate tu nu ai
vazut
> flux maxim scris in <700 de caractere (daca TOP e abonat cumva la
lista:
> ti-am batut recordul de la lot din '98).
>
> Programul meu merge in 7 sec (generarea fisierului de intrare in
4sec), ceea
> ce e foarte bine avand in vedere ca e sub Borland C si n-ai memorie.
Ideea e
> sa faci qsort pe bucati mari si sa interclasezi dup-aia bucatile cu
> heap-uri. Programul are peste 10k, dar e si portabil (merge atat sub
DOS,
> cat si pe sisteme POSIX).
>
> Totusi, ideea lui Mihai e super (adica ce ne-a interzis sa facem).
Daca
> sortezi intai dupa mantise (cu radix) si apoi dupa exponenti (tot cu
radix),
> chiar merge pe IEEE-uri (e un fel de generalizare la radix). Daca ai
si
> numere negative si pozitive, trebuie sa le sortezi separat.
>
> Promit ce implementez quick, merge, heap si radix pe 1M de double-uri
maine
> sau poimaine si va trimit rezultatele. Presupui ca nu vrei bucket sau
alte
> minuni d'astea probabiliste (daca pui limita de 5*solutia comisiei,
presupun
> ca nu vrei chestii probabilistice).
>
> Inca o nota: daca foloseste cineva qsort-ul din C si se incadreaza in
de 5
> ori solutia comisiei inseamna ca comisia a dat ca solutie
bubble-sort. Ideea
> e ca qsort() face un apel la fiecare comparatie, iar un apel costa
enorm.
> BTW, sub Linux qsort() e implementat cu merge-sort :-)
>
> Si-nca o nota la propunerea de rezolvare cu template-uri C++. La
concurs nu
> e recomandabil sa folosesti asta (adica nu prea merg template-urile
pe
> compilatoarele date; la USACO zice clar "do not use..."). Plus,
credeam ce e
> o lista pentru algoritmicieni, nu persoane care programeaza tragand
> compenente cu mouse-ul in fereastra :-)... Daca vrei, punem pariu ca
iti
> implementez ceva care sa mearga de 5 ori mai repede ca
template-urile.
>
> mihai_p
>
>
>
Privacy Policy-
Terms of Service
-
Guidelines
Copyright © 1994-2001
Yahoo! Inc. All rights reserved.