Generare combinari

Această secţiune se ocupă cu programarea, fără a ţine cont de limbaj. Dacă vrei (sau trebuie) să înveți algoritmică, aici este locul potrivit. Descrieri şi idei de algoritmi, algoritmi clasici și întrebări pe baza acestora, toate vor fi postate aici.

Generare combinari

Postby emi » 17 Apr 2010, 16:57

Pentru ca am primit solicitari privind algoritmul de generare de combinari in ordine lexicografica,

  1.  
  2. const max=10;
  3. var
  4.   v:array[1..max] of byte;
  5.   ig,i,n,k:byte;
  6.   c:longint;
  7.  
  8. procedure GenNextComb;
  9. var i,j:byte;
  10. begin
  11.   { ig este indicator de generare }
  12.   if ig=0 then begin
  13.     { la inceput punem numere consecutive }
  14.     for i:=1 to k do v[i]:=i;
  15.     ig:=1; exit;
  16.   end;
  17.  
  18.   for i:=k downto 1 do begin
  19.     if v[i]<n-k+i then begin
  20.       v[i]:=v[i]+1;
  21.       for j:=i+1 to k do v[j]:=v[j-1]+1;
  22.       exit;
  23.     end;
  24.   end;
  25.  
  26.   ig:=0;
  27. end;
  28.  
  29. begin
  30.   c:=0;
  31.   ig:=0;
  32.   write('n=');readln(n);
  33.   write('k=');readln(k);
  34.   repeat
  35.     GenNextComb;
  36.     if ig=0 then
  37.     begin
  38.       readln;
  39.       exit;
  40.     end;
  41.     inc(c); write(c:7,'. ');
  42.     for i:=1 to k do write(v[i]:3); writeln;
  43.   until false;
  44. end.
  45.  


probabil va intrebati la ce foloseste asta... va urma.
0,0p / 0 votes
User avatar
emi
Byte
 
Joined: 10 Apr 2010
Status: 18

Gradul de ortogonalitate a 2 vectori

Postby emi » 26 Apr 2010, 22:03

  1. {
  2.  v1,v2 vectori de lungimi k1,k2.
  3.  functia returneaza cite pozitii au in comun cei 2 vectori
  4.  conditie: vectori ordonati crescator
  5.  ordin: O(k1+k2)
  6. }
  7.  
  8. function ortog(k1,k2:byte; var v1:v1type; var v2:v2type):byte;
  9. var i,j,tmp:byte;
  10. begin
  11.   tmp:=0;
  12.   i:=1;j:=1;
  13.   repeat
  14.     if v1[i]=v2[j] then begin inc(tmp); inc(i); inc(j); end
  15.     else if v1[i]>v2[j] then inc(j) else inc(i);
  16.   until (i>k1) or (j>k2);
  17.   ortog:=tmp;
  18. end
0,0p / 0 votes
User avatar
emi
Byte
 
Joined: 10 Apr 2010
Status: 18

Re: Generare combinari

Postby Dexter » 26 Apr 2010, 23:57

Explică puţin şi ce ai făcut. Din moment ce ţi s-a cerut să scrii despre un anume subiect, e clar că scopul topic-ului este unul educaţional şi nu demonstrativ. Ia fiecare linie de cod în parte şi explică ce face, care-i este rolul, cum se leagă de restul codului. Practic, ăsta e şi obiectivul (mini)tutorialelor.
0,0p / 0 votes
User avatar
Dexter
Word
 
Joined: 04 Jan 2010
Location: Secret Lab
Status: 44.5

Re: Generare combinari

Postby emi » 28 Apr 2010, 00:38

^ Referitor la algoritmul care returneaza cite pozitii au in comun 2 vectori ordonati crescator:

Sa luam un exemplu

v1 = (1, 3, 7, 8, 9);
v2 = (1, 5, 7, 8);

Variabila i parcurge pozitiile lui v1, respectiv j pozitiile lui v2.
Initial i:=1; j:=1; adica prima pozitie din vectori.
Daca v1[i]=v2[j] atunci avem un element in comun, incrementam contorul de elemente comune, deasemenea, pe i si pe j.
Daca v1[i]>v2[j] avem in v1 un element mai mare, si pentru ca vectorii sunt ordonati crescator, incrementam j (adica o sa citim urmatorul element mai mare din v2)
Restul cred ca e intuitiv, si se poate intelege din cod.

p.s. Cineva mi-a cerut ca ii fac un program de loto cu 45 de numere, in loc de asta. Am considerat ca e mai bine sa public ce algoritmi am folosit, pentru ca fiecare sa isi faca ce doreste. Va urma si algoritmul folosit pentru scheme reduse.


L.E. (-- 27 Apr 2010, 13:42 --)

Copie email trimis (catre persoana care solicita ceva similar cu ceea ce deja am publicat):
Descrierea algoritmului folosit:
Se genereaza combinarile de n luate cite k, in ordine lexicografica. (orice student la informatica ar cam trebui sa stie ce inseamna)
Prentru fiecare, se verifica conditia de acoperire, simplificat, cite elemente are in comun cu variantele deja incluse in lista.
Daca nu are in comun 2,3,4 numere (cit vrei) cu ce e deja in lista, se adauga.
Asta e algoritmul „prima neacoperita” realizat de mine, si recunosc ca nu e cine stie ce avansat, doar asigura gradul de ortogonalitate a vectorilor (variantelor in cazul nostru).
0,0p / 0 votes
User avatar
emi
Byte
 
Joined: 10 Apr 2010
Status: 18

Re: Generare combinari

Postby emi » 29 Apr 2010, 21:10

La solicitarea unor utilizatori, explic mai in detaliu:

C(n,k) = n! / ( k! *(n-k)! );
n! = 1*2*3*..*n;
n! se citeste n factorial.

hai sa luam un exemlu: combinari de 3 luate cite 2:
1 2
1 3
2 3

combinari de 5 luate cite 3
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5

Din ce am studiat eu: numarul de repetari al fiecarui element este C(n-1,k-1);
Pentru o schema redusa optima, toate variantele difera de celelalte pe k-a+1 pozitii, (a este la alegere), si numarul de repetari al fiecarui element este acelasi.
0,0p / 0 votes
User avatar
emi
Byte
 
Joined: 10 Apr 2010
Status: 18


Return to Algoritmică

Who is online

Users browsing this forum: No registered users and 0 guests