Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

int21h

Bublifuk turbo

Tdc algoritmy je zcela zkladn tma potaov vdy a dve nebo pozdji se s nimi setk kad programtor. Zdlo by se tedy, e jde o oblast probdanou a e nen teba pst stokrt omlet tma.
Jene co kdy a tak probdan nen?

D se ci, e existuj dv hlavn skupiny tdicch algorim. Rozdlen jde podle nrstu asov nronosti v zvislosti na objemu tdnch dat neboli tak zvan tdic sloitosti.
Algoritmy zaloen na buble sortu (neboli jak j km "bublifuky") nebo na pmm vkldn maj sloitost O*n*n. Co to pesn znamen nevm, ale je zejm, e prmrn doba prchodu roste se druhou mocninou objemu dat.
Algoritmy rodiny QuickSort maj obvykle sloitost O*(n*log(n)) nebo pi idelnm uspodn vstupnch dat mohou dosahovat linern sloitosti. Pro algoritmus HeapSort plat to sam co pro QuickSort, ale je mn pamov nron. QuickSort se obvykle e rekurzivn (je obtn napsat ho iteran) a HeapSort obvykle nerekurzivn.

Zstaneme ale u Bublifuk.
Tyto algoritmy jsou jednoduch a pjde na n i zatenk. Vypadaj njak takhle:
Procedure Bublifuk(var pole:array of integer);
var z:boolean;
    n,j,k,i,ii:integer;
begin
n:=high(pole)-1;
repeat
z:=false;
i:=0;
while i<=n do
    begin
    j:=pole[i];
    ii:=i+1;
    k:=pole[ii];
    if j>k then
       begin
       pole[i]:=k;
       pole[ii]:=j;
       z:=true;
       end;
    i:=ii;
    end;
until not Z;
end;
Tato implementace pat mezi ty pokroilej. Navc jsem se pokusil ji maximln optimalizovat. Vidte, e prvky se v kadm posouvaj vdy maximln o jedno msto v poli a vdy jednm smrem. Tento postup se d v nkterch ppadech urychlit obasnou zmnou pohybu prvk. Takto vylepen bublifuky se nazvaj Petsac algoritmy.

Te se ale podvejte na tento algoritmus. Nic si nedlejte z toho, jestli nerozumte, jak pesn pracuje. J ho taky nechpu. Kadopdn ale takt pat mezi bublifuky.
Procedure BublifukTurbo(var pole:array of integer);
var i,j,l,k,n:integer;
begin
i:=0;
j:=0;
l:=0;
k:=1;
n:=high(pole);
while k>=i do
   begin
   k:=-1;
   while n>k do
      begin
      inc(k);
      l:=pole[k];
      if j>l then
         begin
         pole[i]:=l;
         inc(i);
         pole[k]:=j;
         end;
      if l>j then
         begin
         i:=k;
         j:=pole[k];
         end;
      end;
   j:=0;
   n:=i-1;
   end;
end;
Dleit ovem v tuto chvli nen sloitost zpisu, ale co um. Tedy, kolik seere pamti a jak je rychl. Je zejm, e si dr kladnou vlastnost vech bublifuk, kterou je minimln pamov nronost.
A rychlost?
Rychlost si zmte sami...

{!Bude chtit unit Crt!}
const max=5000;
      pocet_pulzu = 300;
var pole:array[0..max] of integer;
    i,x,d:longint;
begin
randomize;
x:=0;
d:=MemW[Seg0040:$6c];
while d=MemW[Seg0040:$6c] do; {pockam, az skonci aktualni pulz}

repeat
for i:=0 to max do
    begin
    pole[i]:=random(80);      {pole naplnim nahodnymi cisly}
   (*write(pole[i],' ');*)    {pokud bys je chtel videt, tak tohle odkomentuj}
    end;

(*writeln;readln;*)

Bublifuk{Turbo}(pole);   {Tridici rutina. Napred zkus jednu varianu, pak druhou}

(*for i:=0 to 152 do           {zase - kdybys chtel videt setridene pole...}
    begin
    write(pole[i],' ');
    end;*)

inc(x);
until MemW[Seg0040:$6c]>d+pocet_pulzu;

writeln('Probehlo ',x,' cyklu.');
readln;
writeln;
writeln;
end.

Mte zmeno?
eknu vm, e m pln orosilo. Takov nrst vkonu jsem opravdu neekal. Prvn, obyejn, bublifuk jsem napsal j a myslel jsem si, jak jsem ho hezky optimalizoval. A vsledek vidte sami...
Zajm vs, kdo je autorem BublifukuTurbo? No, j to nejsem.
Pravda je takov, e autorem nen nikdo!
BublifukTurbo toti napsal pota. Pesnji eeno je to produkt nhodn mutace kdu. Existuje toti program, kter simuluje evoluci. Zadte tam zdrojov kd a program ho nech nhodn mutovat a jednotliv mutace pak mezi sebou njak sout (asi v rychlosti) a pevaj ty nejlep kusy. Za njakou dobu, nevm, jestli jsou to hodiny nebo dny nebo jet dle se vyselektuj skuten VELMI dobr algoritmy.
Jak u tute, tak BublifukTurbo vznikl sri nhodnch mutac pvodnho Bublifuku. (S tm, e oba algoritmy byly pvodn v C a j je pepsal do pascalu.)

A jak je to se sloitost algoritmu? Nevm.
QuickSort je podle vdc z laboratoe, kde tohle monstrum vzniklo, pod o nco rychlej u zcela nhodnch pol. (Z eho vyplv, e moje testovac rutina nen optimln), ale u pol, kter jsou alespo trochu u pedtm uspodan, vtz BublifukTurbo.
A sten uspodan vstupn data jsou v programtorsk praxi astj ne totln chaos.

Co ct zvrem?
Tohle je prvn hmatateln vsledek genetickch algoritm, kter mm tu est vidt. Je to fascinujc, ale zrove i dost dsiv...
2006-11-30 | Laaca