|
    Metoda "Dziel i zwyciężaj" (divide and conquer) polega na podzieleniu problemu na mniejsze problemy (podproblemy - które na ogół są tym samym problemem, lecz o mniejszych rozmiarach), które następnie rozwiązuje się niezależnie, by w końcowym etapie scalić rezultaty i rozwiązać główny problem. Ideę tej metody można zaprezentować na przykładzie algorytmu wyszukiwania w zbiorze lub porządkowania zbioru. W każdym kroku zbiór jest dzielony na dwie części, elementy tych części są porządkowane. Na koniec uporządkowane części są łączone w uporządkowaną całość (np. sortowanie przez scalanie). Według tej zasady są kreowane algorytmy rekurencyjne. Przykład obrazuje wyszukanie najmniejszej i największej liczby w tablicy "tab" (dane zostają wylosowane), która zostaje wstępnie przez porównanie sąsiednich danych podzielona na 2 mniejsze tablice "tabm" i "tabw", z elementami odpowiednio mniejszymi i większymi, z których z pierwszej wybrany jest najmniejszy element w całym zbiorze, a z drugiej największy. program metoda_dziel_i_zwyciezaj; uses crt; var tab:array[1..50] of integer;     tabm:array[1..25] of integer;     tabw:array[1..25] of integer;     i,j,max,min: integer;       procedure losowanie;    begin      randomize;        for i:=1 to 50 do begin            tab[i]=random(101);        end;    end;    procedure dziel;      begin        j:=0;        i:=1;        repeat           if tab[i]<tab[i+1] then              begin                 j:=j+1;                  tabm[j]:=tablica[i];                  tabw[j]:=tablica[i+1];              end else            begin                 j:=j+1;                  tabw[j]:=tablica[i];                  tabm[j]:=tablica[i+1];              end;          i:=i+2;        until i>=50;    end;    procedure zwyciezaj;       begin      min:=tabm[1];          for i:=1 to 25 do if tabm[i]<min then min:=tabm[i];                   max:=tabw[1];          for i:=1 to 25 do if tabw[i]>max then max:=tabw[i];       end;  begin    clrscr;    losowanie;    writeln('Wylosowane liczby');    for i:=1 to 50 do write (tab[i],' ');    dziel;    zwyciezaj;    writeln('Liczba najmniejsza',min);    writeln('Liczba najwieksza',max);    repeat until keypressed;  end.
|