Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Cautare binara sau liniara?  (Citit de 3682 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
MciprianM
Nu mai tace
*****

Karma: 87
Deconectat Deconectat

Mesaje: 324



Vezi Profilul
« : Iulie 17, 2012, 17:39:28 »

Trebuie sa scrii o functie care sa caute un element de tipul int intr-un array de elemente de tipul int (in C++). Trebuie sa faci functia sa mearga indiferent daca sirul este sortat sau nu. Poti scrie o functie care sa indeplineasca conditiile de pana acum si care sa ia O(log n) atunci cand sirul este sortat? De preferat e ca functia sa fie O(n) atunci cand sirul nu este sortat.
L.E.: Daca nu se poate, demonstrati acest lucru. Care este cea mai buna complexitate care poate fi gasita pe cazul cand sirul e sortat fara sa stim de la bun inceput daca sirul e sortat sau nu?
« Ultima modificare: Iulie 17, 2012, 22:38:16 de către Marginean Ninu Ciprian » Memorat
soriyn
Vorbaret
****

Karma: 24
Deconectat Deconectat

Mesaje: 150



Vezi Profilul
« Răspunde #1 : Iulie 17, 2012, 20:24:29 »

Nu se poate sa presupui ca sirul e sortat si sa cauti binar ? Adica atat timp cat a[ left ]<=a[ mid ]<=a[ right ] caut binar. Cand conditia nu mai e respectata ma opresc si il caut liniar. Bine ca probabil in cel mai defavorabil caz o sa fie O(n+logn) dar nu se aproximeaza la O(n) ?
Memorat
maritim
Vorbaret
****

Karma: 59
Deconectat Deconectat

Mesaje: 176



Vezi Profilul
« Răspunde #2 : Iulie 17, 2012, 20:45:36 »

1 7 3 4 5 6 8 8 9 10

Ia incearca sa cauti elementul 7 in acest array.

?
Memorat
soriyn
Vorbaret
****

Karma: 24
Deconectat Deconectat

Mesaje: 150



Vezi Profilul
« Răspunde #3 : Iulie 17, 2012, 23:07:22 »

Mda mi-am dat si eu seama de asta. Dar daca stii sigur ca elementul ala se afla in vector il poti cauta apoi liniar. Oricum e clar ca nu e o abordare buna Smile)
Memorat
Vman
Echipa infoarena
Vorbaret
*****

Karma: 45
Deconectat Deconectat

Mesaje: 176



Vezi Profilul
« Răspunde #4 : Iulie 18, 2012, 03:05:04 »

Cod:
int cauta(int st, int dr)
{
 if (st == dr)
 {
  if (A[st] == who) return st;
  return -1;
 }

 int m = (st + dr) >> 1;
 if (A[m] == who) return m;
 
 int v = -1;
 if (A[m] < who)
 {
  if (m != st) v = cauta(st, m-1);
  if (v == -1) v = cauta(m+1, dr);
 }
 else
 {
  v = cauta(m+1, dr);
  if (v == -1 && m != st) v = cauta(st, m-1);
 }

 return v;
}

atunci cand vectorul e sortat crescator e cautare binara, se intra doar pe cate una dintre cele 2 ramuri, cu conditia ca elementul sa si existe in vector
in cazul cel mai defavorabil la fiecare apel al functiei se analizeaza exact un element din vector => O(N)
Memorat
MciprianM
Nu mai tace
*****

Karma: 87
Deconectat Deconectat

Mesaje: 324



Vezi Profilul
« Răspunde #5 : Iulie 18, 2012, 15:51:20 »

Smecher!  Applause
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

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