[delphi] Bardzo długo pętla - optymalizacja

0

Witam.
Napisałem algorytm, który szuka powtarzających się kombinacji liczb. Działa świetnie do 3 liczb, przy 4 nie może wyrobić :P Czy mógłby ktoś rzucić okiem i zobaczyć, czy nie da się tego jakoś inaczej napisać?

Czy istnieje możliwość puszczenia tego programu na kilku rdzeniach? Istnieje jakaś biblioteka pozwalająca na pisanie takich programów w delphi?

pliki = 4815

procedure czworki;
var
index, a, b, c, d, x, y : integer;
L, z : longint;
max : array[1..6] of integer;
czworki : array of array of integer;
nowe : boolean;
begin
 L := 0;
 SetLength(czworki, 1, 5);
 czworki[0, 4] := 0;
 for index := 0 to plik do
  begin
   for a := 1 to 49 do
     for b:= a + 1 to 49 do
      for c := b + 1 to 49 do
       for d := c + 1 to 49 do
       begin
        y := 0;
        for x := 0 to 5 do if ((wylosowane[index, x] = a) or (wylosowane[index, x] = b) or (wylosowane[index, x] = c) or (wylosowane[index, x] = d)) then inc(y);
        if y = 4 then
         begin
          nowe := true;
          for z := 0 to L do
           begin
            if ((czworki[z, 0] = a) and (czworki[z, 1] = b) and (czworki[z, 2] = c) and (czworki[z, 3] = d)) then
             begin
              inc(czworki[z, 4]);
              nowe := false;
             end;
           end;
          if nowe = true then 
           begin
            inc(L);
            SetLength(czworki, L + 1, 5);
            czworki[L - 1, 0] := a;
            czworki[L - 1, 1] := b;
	    czworki[L - 1, 2] := c;
	    czworki[L - 1, 3] := c;
            inc(czworki[L - 1, 4]);
           end;      
         end;
       end;
  end;
 dec(L);
 for a := 0 to L do
  begin
   max[1] := czworki[a, 4];
   for b := a to L - 1 do
    if czworki[b, 4] > max[1] then
     begin
      max[1] := czworki[b, 4]; max[2] := czworki[b, 3]; max[3] := czworki[b, 2]; max[4] := czworki[b, 1]; max[5] := czworki[b, 0];
      max[6] := b;
     end;
      czworki[max[6], 0] := czworki[a, 0]; czworki[max[6], 1] := czworki[a, 1]; czworki[max[6], 2] := czworki[a, 2]; czworki[max[6], 3] := czworki[a, 3]; czworki[max[6], 4] := czworki[a, 4];     
      czworki[a, 4] := max[1]; czworki[a, 3] := max[2]; czworki[a, 2] := max[3]; czworki[a, 1] := max[4]; czworki[a, 0] := max[5];  
  end;
end;
0

Co do rdzeni : wątki.

0

mam dejavu... cz ten temat już nie był poruszany?
co to znaczy kombinacji liczb? zrób string liste i
..

var
oLista: TStrings;

...

if (oLista.IndexOf(CIAGZNAKOW) < 0) then
oLista.Add(CIAGZNAKOW)
else
prZrobCośtamJakZnajdzieszPowtarzającySię();

0

Żadne rdzenie ci nie pomogą, jeśli złożoność obliczeniowa algorytmu jest gdzieś w okolicach O(n^6). Nie wiem co to ma robić, ale algorytm w tej postaci zawsze będzie absurdalnie powolny (jak nie dla 4 liczb to dla 5).

1 użytkowników online, w tym zalogowanych: 0, gości: 1