You are on page 1of 7

Chng trnh Pascal cho bi ton ABBA

Nguyn Xun Huy Trong bi "ABBA hay php i xng gng v cc thao tc" ng trong Tin hc & Nh Trng s 1/1999 c ni n hai thut ton gii bi chuyn cc khi b tng lt ng bng. Th theo yu cu ca bn c, trong s ny chng ti s gii thiu chng trnh thc thi v nh gi phc tp ca hai thut ton . Chng ti cng s gii thiu mt th thut n gin o thi gian cho cc bn tin dng sau ny. Trc ht ta nhc li bi ton dng vn tt v d lp trnh nh sau: Bi ton (chuyn phn t): Cho mng nguyn a[1..N] v mt s t nhin K<= N/2. Hy chuyn K phn t t u mng v cui mng. Bi ton ny c gii bng hai gii thut: - Gii thut t nhin vi phc tp K(N+1) php gn. - Gii thut i xng vi phc tp 3N php gn. Trc ht ta t chc d liu cho bi ton. T chc d liu Ta dng mt mng a cha 16000 phn t kiu word. Nh vy N s l hng s c gi tr 16000. Chn K bng mt na ca N, tc l chn 8000 cho gi tr K. Cc i lng ny s c khai bo tng th nh sau: Const N=16000; K=8000; Type Mang=array[1..N] of word; Var a: Mang; Ta s trin khai chng trnh cho hai gii thut nh gii thiu trong bi vit s 1. Gii thut t nhin S 1. S th

Chuyn K ln, mi ln 1 phn t t u mng v cui mng. S 2. S tinh ch ln th nht for i :=1 to K do begin x:= a[1]; {Dch cc phn t a[2..N] v bn tri mt v tr.} a[N]:=x; end; dch cc phn t a[2..N] v bn tri 1 v tr ta dng s 3 sau y: S 3. Dch cc phn t a[2..N] v bn tri 1 v tr for j:=2 to N do a[j-1]:=a[j]; Phi hp cc s 2 v 3 ta thu c th tc ChuyenTuNhien sau y:

Procedure ChuyenTuNhien; Var i,j: word; x: word; begin for i:=1 to K do begin x:=a[1]; {Ly phn t u } {Dch tri 1 n v} for j:=2 to N do a[j-1]:=a[j]; a[N]:=x; {t phn t u vo cui mng} end; end; Gii thut i xng Trc ht xin thay mt Ban bin tp ca ph san Tin hc v Nh Trng thnh tht xin li bn c v mt vi li ch bn trong bi ng s 1. Chng ti xin ngh sa li hai li sau: Li th nht: Trang 12, ct 1, dng 29. Tnh cht 2 ca php i xng gng b in sai, thay cho du nhy kp cc bn sa gip li thnh du nhy n nh sau: (AB)' = B'A'. Li th hai: Trang 12, ct 1, dng 49. Xin sa li nh sau: (A'B')'=B''A''=BA.

Sau y chng ta trin khai gii thut i xng, thc hin nhanh hn gii thut t nhin. S 1. Chuyn i xng t A=a[1..K]; B=a[K+1..N], p dng cng thc (A'B')'=B''A''=BA ta s thu c ngay kt qu cn tm. Gi DoiXung(d,c) l th thut thc hin php i xng on a[d..c] ca mng a, ngha l Doixung(d,c)=(a[d..c])'. Ta c ngay gii thut ChuyenDoiXung sau y: Procedure ChuyenDoiXung; Begin DoiXung(1,K); {A'} DoiXung(K+1,N); {B'} DoiXung(1,N); {(..)'} End; S 2. DoiXung Th tc i xng on a[d..c] s i ch tng cp phn t cch u u v cui nh sau: Procedure DoiXung(d,c: word); Var x: word; begin while d begin x: =a[d]; a[d]:=a[c]; a[c]:=x; inc(d); dec(c); end; end; Kim th chng trnh kim th chng trnh, chng ta thc hin theo s sau: S 1. Kim th mt gii thut Vi mi gii thut ta kim th theo quy trnh 5 bc sau: Bc 1. Sinh ngu nhin d liu cho mng a. Bc 2. Ghi nhn thi im trc khi thc hin th tc chuyn. Bc 3. Thc hin th tc chuyn (gi thut ton ChuyenTuNhien hoc thut ton ChuyenDoiXung).

Bc 4. Ghi nhn thi im sau khi thc hin th tc chuyn. Bc 5. Thng bo thi gian thc hin (tc l phc tp tnh ton)./p> Hai cch o thi gian C hai phng thc ghi nhn thi gian trong mi trng Pascal. Phng thc th nht l dng th tc Gettime(gio,phut,giay,ptgiay) vi cc bin kiu word: gio (gi), phut (pht), giay (giy) v ptgiay (phn trm giy). Sau khi ly c thi im trc v thi im sau, chng ta phi tnh ra s giy chi ph. Vic tnh ton ny c thc hin trong h m 60, ring vi phn trm giy li phi thc hin theo h m thp phn. Nu ch cn tnh n giy, ta dng cch quy i ra giy theo mu sau: S 2. Gettime(gio,phut,giay,ptgiay); Tongsogiaytruoc:=(gio*60+phut)*60+giay; Thc hin th tc... Gettime(gio,phut,giay,ptgiay); Tongsogiaysau:=(gio*60+phut)*60+giay; Tongthoigian:=Tongsogiaysau - Tongsogiaytruoc; Cch thc hin trn i hi nhiu bin v tnh ton phin phc. Xin gii thiu vi bn c phng thc truy nhp thi gian mt cch trc tip. H iu hnh dnh 4 byte trong RAM bt u t a ch 46c (theo h 16) lu tr nhp lm vic ca my tnh. Ta c th truy nhp trc tip n gi tr ny bng cch khai bo mt bin m ta t tn l Nhip. Bin ny phi c ln 4 bytes cho nn ta nh kiu cho n l longint. Bin ny phi c cp pht vo ng a ch 46c. Mun vy, bn phi vit khai bo sau y: Nhip: longint absolute $0000:$046c; Khai bo trn c ngha: Cp pht bin Nhip kiu longint ti a ch tuyt i 46c (h 16). S dng thm 2 bin t1 v t2 kiu longint, ta c th tnh c s Nhip cn thit sau mi ln gi th tc no . S l nh sau: S 3. t1: = Nhip; Thc hin th tc; t2:=Nhip; TongsoNhip:=t2-t1; Tongthoigian:=TongsoNhip/18.2;

Dng cui cng ca s trn cho ta s giy cn thit. V m giy c 18.2 nhp nn chia s nhp cho gi tr ny ta thu c s giy. Lu bn c rng bin Tongthoigian phi c khai bo theo kiu real. Cn bin TongsoNhip c th khai bo l longint. Chng trnh Trong chng trnh di y th tc Gen sinh N gi tr khi u cho mng a theo lut, a[i]=i, i=1..N. Cp theo cch n gin ny s gip ta d theo di hot ng ca chng trnh. Th tc Test1 s thc hin theo gii thut t nhin, cn th tc Test2 dnh cho gii thut i xng. Vi d liu cho, Test1 i hi khong 418 nhp tng ng vi 23 giy, cn Test2 ch i hi 1 nhp v do ch tn 1/18 giy. Th tc Doi(s) hin th thng bo s trn mn hnh v i ngi s dng n phm chuyn qua th tc khc. Th tc Xem hin th gi tr ca mng a trn mn hnh. (*CHUYEN.PAS*) Uses crt; Const N=16000; K=8000; Type Mang=array[1..N] of word; Var Nhip: longint absolute $0000:$046c; a: Mang; t1,t2: longint; Procedure Doi(s: string); Begin writeln; write(s); repeat until readkey <> #0; writeln; End; Procedure Gen; Var i: word; begin for i:=1 to N do a[i]:=i; end; Procedure Xem; Var i: word; begin

for i:=1 to N do write(a[i]:8); end; Procedure ChuyenTuNhien; Var i,j: word; x: word; begin for i:=1 to K do begin x:=a[1]; {Ly phn t u } {Tnh tin 1 v tr} for j:=2 to N do a[j-1]:=a[j]; a[N]:=x; {t phn t u vo cui mng} end; end; Procedure Test1; Begin clrscr; Gen; Doi('Bam phim tuy y de xem du lieu vao cho giai thuat tu nhien:'); Xem; Doi(' Bam phim tuy y de thuc hien giai thuat tu nhien:'); writeln('Voi may PC 486 ban phai doi chung 23..'); t1:=Nhip; ChuyenTuNhien; t2:=Nhip; Doi('Ket thuc giai thuat tu nhien. Bam phim tuy y de xem du lieu ra:'); Xem; Doi('Bam phim tuy y de xem thong bao:'); write('Thoi gian thuc hien giai thuat tu nhien:', t2-t1 , '(nhip)='); writeln(((t2-t1)/18.2):0:0,'(giay)'); Doi('Bam phim tuy y de ket thuc:'); end; Procedure DoiXung(d,c: word); Var x: word; begin while d begin x: =a[d]; a[d]:=a[c]; a[c]:=x; inc(d);

dec(c); end; Procedure ChuyenDoiXung; Begin DoiXung(1,K); DoiXung(K+1,N); DoiXung(1,N); End; Procedure Test2; begin clrscr; Gen; Doi('Bam phim tuy y de xem du lieu vao cho giai thuat doi xung:'); Xem; Doi('Bam phim tuy y de thuc hien giai thuat doi xung:'); t1:=Nhip; ChuyenDoiXung; t2:=Nhip; Doi('Ket thuc giai thuat doi xung. Bam phim tuy y de xem du lieu ra:'); Xem; Doi('Bam phim tuy y de xem thong bao:'); write('Thoi gian thuc hien giai thuat doi xung:',t2-t1 , '(nhip)='); writeln(((t2-t1)/18.2):0:0,'(giay)'); Doi('Bam phim tuy y de ket thuc:'); end; BEGIN Test2; Test1; END.

You might also like