Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.24;
Скачать: CL | DM;

Вниз

Алгоритм Бинарного Поиска - помогите плиз...   Найти похожие ветки 

 
Rradion   (2003-11-12 14:33) [0]

Добрый день,
Написал такой код алгоритма бинарного поиска. На первый взгляд, вроде, все нормально... а при нажимании на соответствующию кнопку, он зависает :( .

procedure TForm1.Button5Click(Sender: TObject);
begin
Steps:=0;
G1:=0; G2:=N;
Gmid:=G2-G1;
Gmid:=Trunc(Gmid/2);
nashel:=1;
Kluch:= StrToInt( Edit2.Text );

While nashel=1 do
begin

If MASS[Gmid] = Kluch then
begin
Steps:=Steps+1; // Esli nashli Kluch, to nashel:=2 i vihodim iz tsikla
nashel:=2;
MessageDlg( "Found , at "+IntToStr(Gmid+1) +". Steps made: "+IntToStr(Steps), mtinformation , [mbOK], 5 );
end
else
If MASS[Gmid] > Kluch then
begin // Esli seredina > Kljucha, to vtoruju 1/2 uberaem.
G1:=Gmid;
Gmid:=Trunc((G1+G2) / 2);
Inc(Steps);
end
else
If MASS[Gmid] < Kluch then
begin;
G2:=Gmid; // Esli seredina < Kljucha, to pervuju 1/2 uberaem.
Gmid:=Trunc((G1+G2)/2);
Inc(Steps);
end
else
begin // Esli Kljuch tak i ne nashli, to tozhe vihodim iz tsikla.
nashel:=0;
MessageDlg( "Not Found. Steps made: "+IntToStr(Steps), mtinformation , [mbOK], 5 );
end;

end;

end;


Что посоветуете?
Спасибо!


 
Digitman ©   (2003-11-12 14:51) [1]

возьми за образец алгоритм метода

function TStringList.Find()

и не парься)


 
Rradion   (2003-11-12 14:59) [2]

Да нет, именно бинарным поиском заданно :(


 
vuk ©   (2003-11-12 15:05) [3]

Так там и есть бинарный поиск.


 
han_malign ©   (2003-11-12 15:10) [4]

> Что посоветуете?
- циклограмму построить

MASS: 3 2 1
Kluch=4

G1|G2|Gmid|nashel|
0 | 2| 1| 1| MASS[Gmid] < Kluch
0 | 1| 0| 1| MASS[Gmid] < Kluch
0 | 0| 0| 1| MASS[Gmid] < Kluch
0 | 0| 0| 1| MASS[Gmid] < Kluch
.......................................
0 | 0| 0| 1| MASS[Gmid] < Kluch


MASS: 4 2 1
Kluch=3

G1|G2|Gmid|nashel|
0 | 2| 1| 1| MASS[Gmid] < Kluch
0 | 1| 0| 1| MASS[Gmid] > Kluch
0 | 1| 0| 1| MASS[Gmid] > Kluch
.......................................
0 | 1| 0| 1| MASS[Gmid] > Kluch


>> возьми за образец алгоритм метода function TStringList.Find()
> Да нет, именно бинарным поиском заданно :(
- а там по твоему какой???
если тебя смущает I := (L + H) shr 1 - можешь заменить эту строку на твое любимое I:=Trunc((L+H)/2)...


 
Rradion   (2003-11-12 15:23) [5]

>>возьми за образец алгоритм метода function TStringList.Find()
...
>>если тебя смущает I := (L + H) shr 1 - можешь заменить эту строку на твое любимое I:=Trunc((L+H)/2)...

А... а где его взять то :?

Спасибо!


 
Digitman ©   (2003-11-12 15:33) [6]


> где его взять то


в кнопке F1, нажатой когда курсор стоит на набранной вышеупомянутой фразе ... открывается хэлп, где черным по белому написано, что метод декларирован и реализован в модуле Classes.pas ... открываешь этот модуль , находишь текст реализации метода

F1 - великая штука !!


 
Малиновский Владимир   (2003-11-12 15:38) [7]

function TStringList.Find(const S: string; var Index: Integer): Boolean;
var
L, H, I, C: Integer;
begin
Result := False;
L := 0;
H := FCount - 1;
while L <= H do
begin
I := (L + H) shr 1;
C := CompareStrings(FList^[I].FString, S);
if C < 0 then L := I + 1 else
begin
H := I - 1;
if C = 0 then
begin
Result := True;
if Duplicates <> dupAccept then L := I;
end;
end;
end;
Index := L;
end;


 
T   (2003-11-12 15:42) [8]

G1:=0; G2:=N;
Gmid:=G2-G1;
Gmid:=Trunc(Gmid/2);
Kluch:= StrToInt( Edit2.Text );

While (MASS[Gmid] <> Kluch) and (Gmid <> G1) do
begin
If MASS[Gmid] < Kluch then G1 := Gmid
else {MASS[Gmid] > Kluch} G0 := Gmid;
Gmid := Trunc((G0 + G1)/2);
end;
if MASS[Gmid] = Kluch then
MessageDlg( "Found "+IntToStr(Gmid), mtinformation , [mbOK])
else
MessageDlg( "Not Found", mtinformation , [mbOK]);


 
T   (2003-11-12 15:42) [9]

G1:=0; G2:=N;
Gmid:=G2-G1;
Gmid:=Trunc(Gmid/2);
Kluch:= StrToInt( Edit2.Text );

While (MASS[Gmid] <> Kluch) and (Gmid <> G0) do
begin
If MASS[Gmid] < Kluch then G1 := Gmid
else {MASS[Gmid] > Kluch} G0 := Gmid;
Gmid := Trunc((G0 + G1)/2);
end;
if MASS[Gmid] = Kluch then
MessageDlg( "Found "+IntToStr(Gmid), mtinformation , [mbOK])
else
MessageDlg( "Not Found", mtinformation , [mbOK]);


 
T   (2003-11-12 15:42) [10]

G1:=0; G2:=N;
Gmid:=G2-G1;
Gmid:=Trunc(Gmid/2);
Kluch:= StrToInt( Edit2.Text );

While (MASS[Gmid] <> Kluch) and (Gmid <> G0) do
begin
If MASS[Gmid] < Kluch then G0 := Gmid
else {MASS[Gmid] > Kluch} G1 := Gmid;
Gmid := Trunc((G0 + G1)/2);
end;
if MASS[Gmid] = Kluch then
MessageDlg( "Found "+IntToStr(Gmid), mtinformation , [mbOK])
else
MessageDlg( "Not Found", mtinformation , [mbOK]);


 
Rradion   (2003-11-12 15:56) [11]

Spasibo T! Vsjo rabotaet! Nastojashij drug! :)



Страницы: 1 вся ветка

Текущий архив: 2003.11.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
4-79223
AKA
2003-09-28 16:24
2003.11.24
Mousewheel


8-79059
R
2003-07-28 08:34
2003.11.24
Смена точки цветовой прозрачности в Image


3-78778
Liavik
2003-11-05 17:20
2003.11.24
QuickRep


3-78837
Nick-From
2003-11-02 13:00
2003.11.24
Проблема в FastReport


4-79243
free
2003-09-25 23:04
2003.11.24
Нажатие клавишь