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


Karma: -5
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« : Noiembrie 12, 2008, 17:19:39 »

Vreau sa fac o matrice 64000x64000 si nu vrea sa-mi compileze ca e prea mare. Am incercat si dinamic, dar programul este inchis de windows (vezi attachmentul). Dupa cum se vede am incercat sa maresc si stiva la 16mb, dar la fel. Ma poate ajuta cineva cu aceasta problema si eventual cu argumentele pt compilator?
« Ultima modificare: Noiembrie 15, 2008, 16:39:50 de către Coriu Radu Gabriel » Memorat
svalentin
Nu mai tace
*****

Karma: 88
Deconectat Deconectat

Mesaje: 704



Vezi Profilul
« Răspunde #1 : Noiembrie 12, 2008, 18:47:28 »

Incearca sa folosesti STL bitset - http://www.sgi.com/tech/stl/bitset.html

Stiu ca desi bool ar trebui sa ocupe 1 bit, C-ul il tine ca 1 byte. Asta ar insemna 64k * 64k * 1 byte = 4GB.
Windows te lasa sa aloci maxim 2 giga bytes de memorie per proces. Incearca sa afisezi pe ecran i-ul din for. Asa o sa vezi exact cand iti da eraore programul si poti sa vezi cat ti-a intrat in memorie.
Memorat
keenox
Strain


Karma: -5
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #2 : Noiembrie 12, 2008, 20:48:34 »

i-am bagat "i"-ul pe output si se opreste la 33010. chestia cu bool-ul ca byte o stiam si mi se pare aiurea.

le: cum pot face o matrice din bitset? (adica de fapt un array). am incercat

Cod:
vector<bitset<MAX>> puncte(MAX);

dar nu merge.
« Ultima modificare: Noiembrie 12, 2008, 21:32:10 de către Coriu Radu Gabriel » Memorat
Mishu91
Nu mai tace
*****

Karma: 169
Deconectat Deconectat

Mesaje: 751



Vezi Profilul
« Răspunde #3 : Noiembrie 12, 2008, 21:45:08 »

Cod:
#include <bitset>
using namespace std;
bitset<MAX> V[MAX];

L. E.
merge si
Cod:
vector <bitset<MAX> > V(MAX)
dar trebuie sa lasi spatiu intre cele doua semne de 'mai mare' de la vector si bitset pt ca '>>' inseamna deplasare pe biti
« Ultima modificare: Noiembrie 12, 2008, 21:50:49 de către Andrei Misarca » Memorat
keenox
Strain


Karma: -5
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #4 : Noiembrie 12, 2008, 22:01:57 »

mersi mult
Memorat
svalentin
Nu mai tace
*****

Karma: 88
Deconectat Deconectat

Mesaje: 704



Vezi Profilul
« Răspunde #5 : Noiembrie 12, 2008, 23:14:31 »

i-am bagat "i"-ul pe output si se opreste la 33010. chestia cu bool-ul ca byte o stiam si mi se pare aiurea.

Observi? 64000 * 33010 * 1 byte ~= 2GB - acea limita maxima de memorie per proces.
Memorat
keenox
Strain


Karma: -5
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #6 : Noiembrie 13, 2008, 20:37:56 »

mersi pt raspunsuri. imi trebuia pt problema forum de la campion. imi poate explica si mie cineva de e ala algoritm envelope?  Annoyed. ca la noi in "sat" n-are cine sa ne invete  Angry
Memorat
sigrid
De-al casei
***

Karma: 61
Deconectat Deconectat

Mesaje: 129



Vezi Profilul
« Răspunde #7 : Noiembrie 13, 2008, 22:48:40 »

@keenox: Tonul de-l folosesti tu e unul urat. Nu e nimeni vinovat pentru destinul tau.

Si mie mi-ar placea sa stiu de unde pot invata despre algoritmul asta. Am incercat sa caut pe net, dar nu cred ca am dat peste ce trebuie  Smile. Ma poate ajuta cineva, va rog?
Memorat
keenox
Strain


Karma: -5
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #8 : Noiembrie 14, 2008, 14:52:32 »

aseara eram nervos si aveam (inca am) motive sa fiu.

offtopic: nu exista destin. sau cel putin la modul la care te referi tu. dar sa lasam pb asta ca aici e forum de info, nu de filosofie

LE: m-am mai jucat un pic cu sursa programelului si cu bitseturile. am observat ca numai 2 declaratii de bitset imi consumau 0.750 s. e cam mult, enorm chiar, in situatia in care timpul maxim era de 0.35 pt problema. niste solutii mai rapide nu exista?
« Ultima modificare: Noiembrie 14, 2008, 20:27:16 de către Coriu Radu Gabriel » Memorat
Adriana_S
De-al casei
***

Karma: 51
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #9 : Noiembrie 14, 2008, 20:52:50 »

Mai interesant mi se pare ca in solutie, dupa ce se face Upper-Envelope si Lower-Envelope se parcurg toate anvelopele. Smile
Memorat

gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« Răspunde #10 : Noiembrie 14, 2008, 22:23:03 »

niste solutii mai rapide nu exista?
Diagrama Voronoi merge bine.
Memorat
keenox
Strain


Karma: -5
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #11 : Noiembrie 15, 2008, 15:52:33 »

la partea cu rapid, ma refeream la o alternativa mai rapida la bitset. cat despre solutia problemei nu comentez pentru ca, in primul rand, nu am inteles-o.

Adriana_S imi poti explica si mie, te rog, ce presupune algoritmul envelope? si ce sunt upper/lower-envelope? multumesc
Memorat
Adriana_S
De-al casei
***

Karma: 51
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #12 : Noiembrie 15, 2008, 21:50:41 »

Ma refeream la faptul ca envelope inseamna plic, nu anvelopa.
N-am nici o idee ce-s upper-envelope si lower-envelope, in mintea mea sunt partea de sus a plicului si partea de jos. Smile
Memorat

sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #13 : Noiembrie 15, 2008, 22:26:24 »

Nu s-a gandit nimeni la o solutie cu mediatoare de segmente?  Confused Mie in timpul rundei mi s-a parut ca functiona (ca iesea din timp era din vina mea, desi complexitatea era M log N)...
Memorat
gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« Răspunde #14 : Noiembrie 15, 2008, 22:32:20 »

Eu am facut cu mediatoare de segmente... si a mers  Smile
Memorat
devilkind
Echipa infoarena
Nu mai tace
*****

Karma: 284
Deconectat Deconectat

Mesaje: 1.240



Vezi Profilul
« Răspunde #15 : Noiembrie 15, 2008, 22:45:59 »

mediatoare de segmente? nu te referi cumva la voronoi?
Memorat
gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« Răspunde #16 : Noiembrie 15, 2008, 22:47:04 »

Ba da, am construit poligonul asociat originii intersectand mediatoarele segmentelor (O,Pi).
« Ultima modificare: Noiembrie 15, 2008, 22:56:18 de către Bitis Gabriel » Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #17 : Noiembrie 16, 2008, 10:46:00 »

mediatoare de segmente? nu te referi cumva la voronoi?

Nu, nu am parcurs articolul cu voronoi cat sa-l si inteleg pe deplin Very Happy
Luam toate segmentele pe care le facea O cu "casele" si le trasam mediatoarele (retineam a,b,c). Pt ca un centru sa fie valid, trebuia sa se afle de aceeasi parte a tuturor dreptelor ca si O (Gabriel, am considerat cazul in care mediatoarele nu se "inchid" intr-un poligon). Daca initial ordonam "casele" dupa panta lui OPi, puteam sa caut binar doar 2 mediatoare cu care ar fi trebuit sa verific, cu restul fiind ok din start.
Memorat
gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« Răspunde #18 : Noiembrie 16, 2008, 12:57:49 »

Eu am luat un poligon initial cu colturile in (32000, 32000), (32000, -32000), (-32000, -32000),  (-32000, 32000), si pe asta il intersectam cu fiecare mediatoare, la fiecare pas "aruncand" bucata de poligon care nu era de aceeasi parte cu O, astfel am obtinut de fiecare data un poligon, chiar daca nu era format in totalitate de mediatoare.
Query am facut in O(M*nr_laturi_poligon).
Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #19 : Noiembrie 16, 2008, 14:01:42 »

Si eu m-am gandit la asta, dar era mai mult de munca. Daca ordonai punctele poligonului tau dupa panta lui OPi, avand in vedere ca il contine pe O, puteai cauta binar si verificai in O(log nr_laturi) pe query. Ai luat 100?

PS: devenim off-topic... pana la urma ce e algoritmul upper/lower envelope?
Memorat
gabitzish1
Moderatori infoarena
Nu mai tace
*****

Karma: 321
Deconectat Deconectat

Mesaje: 926



Vezi Profilul
« Răspunde #20 : Noiembrie 16, 2008, 14:37:06 »

Si eu m-am gandit la asta, dar era mai mult de munca. Daca ordonai punctele poligonului tau dupa panta lui OPi, avand in vedere ca il contine pe O, puteai cauta binar si verificai in O(log nr_laturi) pe query. Ai luat 100?

PS: devenim off-topic... pana la urma ce e algoritmul upper/lower envelope?
Da, am luat 100 cu treaba aia.
On-topic... nu prea stiu ce e algoritmul upper/lower envelope... Confused
Memorat
gcosmin
Nu mai tace
*****

Karma: 205
Deconectat Deconectat

Mesaje: 307



Vezi Profilul
« Răspunde #21 : Noiembrie 16, 2008, 17:39:41 »

In solutia de la problema forum, autorul calculeaza mai pe lung niste drepte care impart planul in doua semiplane si ar trebui ca punctul nostru sa fie de aceesi parte a acestor drepte ca si punctul (0, 0), ca punctul sa fie bun (adica sa putem pune un forum acolo). Aceste drepte sunt de fapt, mediatoarele despre care vorbiti.

Daca intersectam aceste semiplane, o sa ne dea un poligon in interiorul caruia punctul de query trebuie sa se afle, ca sa fie bun. Ajungem deci la intersectii de semiplane, problema ce se poate rezolva in N log N.

Upper envelope si Lower envelope sunt urmatoarele chestii: impartim dreptele ce determina semiplanele in doua categorii (alea cu panta negativa si alea cu panta pozitiva). Daca intersectam semiplanele dintr-un tip o sa ne dea o structura ori convexa ori concava (un fel de semicerc superior si semicerc inferior (dar mai patratos : Tongue)). Astea se numesc upper envelope si lower envelope pentru ca parca impacheteaza ceva (cred.... nici eu nu stiu de ce le zice asa exact Very Happy). Acum punctul nostru trebuie sa fie sub upper envelope si deasupra lui lower envelope ca sa fie bun.

Pentru a determina unul din envelopuri, sortam dreptele dupa panta si iese un algoritm care se foloseste de o stiva. Parcurgem dreptele in ordine si tinem dreptele vizibile (din (0, 0) = origine) intr-o stiva. O dreapta nou bagata o sa faca cateva din ultimele drepte din stiva (posibil) sa nu mai fie vizible, si altfel le scoatem din stiva pe rand. La sfarsit in stiva se vor afla dreptele vizibile din (0, 0). Daca incercati acest algoritm cu toate dreptele odata o sa observati ca nu merge pentru se intampla dubiosenii cand treci la cealata multime de drepte.

Pentru a intelege mai bine algoritmul e bine sa desenati pe foaie cateva drepte de panta de acelasi semn si sa simulati putin, sa vedeti cum se comporta si de ce daca parcurgand dreptele in ordinea pantei, ultimele adaugate pot iesi.

Intersectia celor doua envelopuri ne da fix poligonul care reprezinta intersectia semiplanelor. Intersectia se poate rezolva in complexitate liniara si de aici complexitate de N log N pentru determinarea pligonului (N log N de la sortare).

Sper ca am fost destul de explicit si am lamurit pe toata lumea  Very Happy
« Ultima modificare: Noiembrie 16, 2008, 17:54:02 de către Gheorghe Cosmin » Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

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