Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Problema interesanta triunghi dreptunghic  (Citit de 2076 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
Doru_AC
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« : Decembrie 17, 2011, 23:10:28 »

Salutare,

Sa presupunem ca avem N betisoare. Cum construiesc un algoritm mai eficient decat O(N^3)  care determina daca printre cele N betisoare exista o combinatie de trei betisoare care formeaza un triunghi dreptunghic ?
Lungimea betisoarelor se presupune cunoscuta.

Multumesc
Memorat
MciprianM
Nu mai tace
*****

Karma: 87
Deconectat Deconectat

Mesaje: 324



Vezi Profilul
« Răspunde #1 : Decembrie 17, 2011, 23:39:07 »

Poti sa sortezi betisoarele dupa lungimea lor, iei perechi de cate doua betisoare (sa zicem ca astea ar fi catetele) si pentru fiecare pereche, verifici daca exista un betisor cu lungimea egala cu lungimea ipotenuzei(lungimea ipotenuzei o determini cu teorema lui Pitagora). Verificarea o faci cautand binar lungimea catetei in sirul sortat de betisoare. Complexitate: O(n^2 logn).
Cu hashuri poti sa obtii un timp mediu de O(n^2).
Memorat
klamathix
Echipa infoarena
Nu mai tace
*****

Karma: 733
Deconectat Deconectat

Mesaje: 1.216



Vezi Profilul
« Răspunde #2 : Decembrie 18, 2011, 00:31:25 »

Poti obtine O(n ^ 2) curat, worst-case. Ideea e ca pentru o cateta i fixata, cu cat cresti lungimea catetei j creste si ipotenuza, deci in loc sa faci cautare binara de fiecare data doar cresti un iterator care in total trece prin maxim toate n elemente.
Memorat
Doru_AC
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #3 : Decembrie 18, 2011, 00:39:32 »

Foarte tare. Cum mai putin de O(n^2) nu se poate, e perfect. Multumesc  Dancing

L.E. Am incercat sa o implementez in O(n^2) insa nu cred ca se poate fara cautare binara. Poti sa dai mai multe detalii in legatura cu iteratorul pe care il incrementez?
« Ultima modificare: Decembrie 18, 2011, 02:03:23 de către Doru Gucea » Memorat
savim
Nu mai tace
*****

Karma: 194
Deconectat Deconectat

Mesaje: 333



Vezi Profilul
« Răspunde #4 : Decembrie 18, 2011, 03:02:17 »

Uite mai explicit. Sortezi initial cele N valori in N log N.

Apoi, iti fixezi ipotenuza -> O(n).
Iti fixezi o cateta -> pana acum ai O(n^2).
A treia cateta stii cu cat este egala (stii ipotenuza si o cateta), deci ce ramane de facut este sa verifici daca valoarea se afla in sirul tau.
Poti face asta cautand binar in log N.
Dar - daca ai ipotenuza fixata, si valoarea primei catete creste, valoarea celei de-a doua catete va scadea.

Cu alte cuvinte, daca ai sirul X1 < X2 < .. < Xn, si presupunem ca ai gasit tripletul ipotenuza,cateta,cateta = Xi,Xj,Xk. Daca vei alege o cateta Xj+x, a doua cateta poate fi aleasa doar in stanga lui k, adica Xk-y. Ideea e sa-ti tii un pointer care initial arata spre cel mai mare element, si atata timp cat valoarea spre care pointeaza e mai mare decat ce ai tu nevoie, sa-l decrementezi. Iese O(N^2) per total, sper ca ai inteles.
« Ultima modificare: Decembrie 18, 2011, 20:45:43 de către Serban Andrei Stan » Memorat
Doru_AC
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #5 : Decembrie 18, 2011, 19:53:17 »

L-am implementat. Multumesc mult pentru explicatii.
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

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