Форум: "Основная";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];
ВнизАлгоритм Бинарного Поиска - помогите плиз... Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c