Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
4
Добавлен:
01.05.2014
Размер:
6.55 Кб
Скачать
Uses Dos,crt;
const nMax = 2048;
nMax1= 2049;
type index=1..nMax;
index0=0..nMax;
index1=1..nMax1;
DimVec=index;
ElemT=Integer;
Vec =array [index] of ElemT;
BinS_proc = procedure ( {in} n: DimVec; var a: Vec; x: ElemT;
{out} var q: Boolean; var L: index0 );
{--------------------------------------------------------------------}
procedure BinSearch1 ( n : DimVec; var a : Vec; x : ElemT;
var q : Boolean; var L : index0 );
{  аЈ : n, a, x; १ : q, L }
{ Pred: (ALL i : 1<=i<n : a[i]<a[i+1])
Post: (1<=L<=n+1) & (a[L-1]<x<=a[L]) &
(q = (1<=L<=n)&(a[L]=x)) }
var R : index1; M : index;
begin
L := 1;
R := n+1;
{ inv: (1<=L<=R<=n+1) & (a[L-1]<x<=a[R]) }
while L<>R do
begin
M := (L+R) div 2;
if a[M]<x then L := M+1 else R := M
end {while};
{ (1<=L<=n+1) & (a[L-1]<x<=a[L])}
if L<>n+1 then q :=(x=a[L]) else q := False
end {BinSearch1};
{--------------------------------------------------------------------}
procedure BinSearch2 ( n : DimVec; var a : Vec; x : ElemT;
var q : Boolean; var L : index0 );
{  аЈ : n, a, x; १ : q, L }
{ Pred: (ALL i : 1<=i<n : a[i]<a[i+1])
Post: (0<=L<=n) & (a[L]<x<=a[L+1]) &
(q = (0<=L<=n-1)&(a[L+1]=x) ) }
var R : index1;
M : index;
begin
L := 0;
R := n+1; {a[L]<x<=a[R]}
while L+1<>R do
begin {(0<=L<R-1<=n) & (a[L]<x<=a[R])}
M := (L+R) div 2;
if a[M]<x then L := M else R := M
end {while};
{ (0<=L<=n) & (a[L]<x<=a[L+1])}
if L<>n then q :=(x=a[L+1]) else q := False
end {BinSearch2};
{--------------------------------------------------------------------}
procedure BinSearch3 ( n : DimVec; var a : Vec; x : ElemT;
var q : Boolean; var L : index0 );
{  аЈ : a, x; १ : q, L
Pred: (n=1000) & (ALL i : 1<=i<n : a[i]<a[i+1])
Post: (0<=L<=n) & (a[L]<x<=a[L+1]) &
(q = (0<=L<=n-1)&(a[L+1]=x) )}
{const n = 1000; !}
var i : 1..512;
M : index;
begin
i := 512;
if a[i]<x then L := n-i+1 else L := 0;
{(a[L]<x<=a[L+i]) & (i=512=2^j) & (j=9) & (L=L0)}
while i<>1 do
begin
i := i div 2;
M := L+i;
if a[M]<x then L := M else ;
{(i=2^j) & (0<=j<9) & (a[L]<x<=a[L+i]) & (L0<=L<=L0+511)
& (L+i<=n+1)}
end { while} ; { Bound : j=log2(i)}
{ (0<=L<=n) & (a[L]<x<=a[L+1])}
if L<>n then q :=(x=a[L+1]) else q := False
end {BinSearch3};
{--------------------------------------------------------------------}
procedure BinSearch4 ( n : DimVec; var a : Vec; x : ElemT;
var q : Boolean; var L : index0 );
{  аЈ : a, x; १ : q, L
Pred: (n=1000) & (ALL i : 1<=i<n : a[i]<a[i+1])
Post: (0<=L<=n) & (a[L]<x<=a[L+1]) &
(q = (0<=L<=n-1)&(a[L+1]=x) )}
{const n = 1000; !}
begin L := 0;
if a[512]<x then L := n-512+1; { a[L]<x<=a[L+512]}
if a[L+256]<x then L := L+256; { a[L]<x<=a[L+256] }
if a[L+128]<x then L := L+128;
if a[L+ 64]<x then L := L+ 64;
if a[L+ 32]<x then L := L+ 32;
if a[L+ 16]<x then L := L+ 16;
if a[L+ 8]<x then L := L+ 8;
if a[L+ 4]<x then L := L+ 4;
if a[L+ 2]<x then L := L+ 2;
if a[L+ 1]<x then L := L+ 1;
{ (0<=L<=n) & (a[L]<x<=a[L+ 1])}
if L<>n then q :=(x=a[L+1]) else q := False
end {BinSearch4};
{--------------------------------------------------------------------}

procedure BinSearch5 ( n : DimVec; var a : Vec; x : ElemT;
var q : Boolean; var L : index0 );
{  аЈ : a, x; १ : q, L
Pred: (n=1000) & (ALL i : 1<=i<n : a[i]<a[i+1])
Post: (0<=L<=n) & (a[L]<x<=a[L+1]) &
(q = (0<=L<=n-1)&(a[L+1]=x) )}
{const n = 1000; !}
var M : index;
begin L := 0;
if a[512]<x then L := n-512+1; { a[L]<x<=a[L+512]}
M:= L+256; if a[M]<x then L :=M; { a[L]<x<=a[L+256] }
M:= L+128; if a[M]<x then L :=M;
M:= L+ 64; if a[M]<x then L :=M;
M:= L+ 32; if a[M]<x then L :=M;
M:= L+ 16; if a[M]<x then L :=M;
M:= L+ 8; if a[M]<x then L :=M;
M:= L+ 4; if a[M]<x then L :=M;
M:= L+ 2; if a[M]<x then L :=M;
M:= L+ 1; if a[M]<x then L :=M;
{ (0<=L<=n) & (a[L]<x<=a[L+ 1])}
if L<>n then q :=(x=a[L+1]) else q := False
end {BinSearch5};
{--------------------------------------------------------------------}
procedure MyGetTime ( var t : LongInt );
{ўл¤ Ґв ўаҐ¬п ў б®вле ¤®«пе ᥪ㭤л}
var h, m, s , hund : Word;
begin
GetTime( h, m , s, hund);
t:= s + 60 * m;
t:= hund + 100 * t
end{ MyGetTime };
{--------------------------------------------------------------------}
procedure MyUnPackTime ( t: LongInt; var m, s, hund : Word );
{ЇҐаҐў®¤Ёв ўаҐ¬п t (ў б®вле ¤®«пе ᥪ㭤л)
ў ¬Ё­гвл m, ᥪ㭤л s, б®влҐ hund }
begin
hund:= t mod 100;
t:= t div 100; {ў ᥪ㭠е}
s:= t mod 60;
m:= t div 60
end{ MyUnPackTime };
{--------------------------------------------------------------------}
var fout:text; {ўл室­®© д ©«}
t, t1,t2 : LongInt;
min, sec, s100 : Word;

var a: Vec;
i, n, n1 : index1;
L: index0;

q : Boolean;
x : ElemT;
j, nProgon, iv : Word;
{--------------------------------------------------------------------}
Procedure Computation ( BinS: BinS_proc);
begin
WriteLn('BinSearch',iv:1,':');
Write(fout,'BinSearch',iv:1,': ');
MyGetTime(t1);
{Calculation:}
for j:=1 to nProgon do {Їа®Ј®­л ¤«п 㢥«ЁзҐ­Ёп Ё§¬Ґа塞®Ј® ўаҐ¬Ґ­Ё}
for i:=1 to n1 do
{жЁЄ« Ї® а §­л¬ ў аЁ ­в ¬ ЇаҐ¤кпў«Ґ­Ёп н«Ґ¬Ґ­в  x (Ї® ўбҐ¬ Ёб室 ¬)}
begin
x:=i;
BinS ( n, a, x, q, L );
end;
MyGetTime(t2);
t := t2 - t1; MyUnPackTime( t, min, sec, s100);
if(s100<10)
then WriteLn(fout,'ўаҐ¬п = ', min,' ¬Ё­ ', sec,'.0', s100,' ᥪ')
else WriteLn(fout,'ўаҐ¬п = ', min,' ¬Ё­ ', sec,'.', s100,' ᥪ');
end {Computation};
{--------------------------------------------------------------------}
begin
clrscr;
Assign(fout,'BinS5.DAT');
Rewrite(fout);
n:=1000; n1:=n+1; nProgon:=100;
WriteLn(fout,'ђ §¬Ґа ¬ ббЁў  = ',n:5);
WriteLn(fout,'—Ёб«® Їа®Ј®­®ў = ',nProgon:5,' * ',n1);
WriteLn(fout,'€§¬ҐаҐ­ЁҐ ўаҐ¬Ґ­Ё а Ў®вл :');

{ЈҐ­Ґа жЁп ¬ ббЁў :}
for i:=1 to n do a[i]:=i;

iv:=1; Computation ( BinSearch1);
Inc(iv); Computation ( BinSearch2);
Inc(iv); Computation ( BinSearch3);
Inc(iv); Computation ( BinSearch4);
Inc(iv); Computation ( BinSearch5);

Close (fout)
end.

Соседние файлы в папке Бинарный поиск1