![]() |
|
|
#1
|
|||
|
|||
|
нужно сделать таблицу из 20 записей с ключами, отсортированными по возрастанию. Реализовать двоичный поиск, вывести результат и количество сравнений.
что-то делать начала... только не понимаю как вызвать функцию, чтобы работало всеКод:
function ListviewBinarySearch(listview: TListview; const Item: string;
var Index: Integer): Boolean;
var
First, last, pivot, res, k: Integer; Memo1:TMemo;
begin
Memo1.Clear;
k:=0;
Assert(Assigned(listview));
Assert(Length(item) > 0);
Result := False;
Index := 0;
if listview.Items.Count = 0 then Exit;
First := 0;
last := listview.Items.Count - 1;
repeat
k:=k+1;
pivot := (First + last) div 2;
res := lstrcmp(PChar(item), PChar(listview.Items[pivot].Caption));
if res = 0 then
begin
{ Found the item, return its index and exit. }
Index := pivot;
Result := True;
Break;
end { If }
else if res > 0 then
begin
{ Item is larger than item at pivot }
First := pivot + 1;
end { If }
else
begin
{ Item is smaller than item at pivot }
last := pivot - 1;
end;
until last < First;
Index := First;
Memo1.Lines.Add('количество сравнений=: '+IntToStr(k));
end; { ListviewBinarySearch }
procedure TForm1.Button1Click(Sender: TObject);
var i:integer; m: boolean; listveiew1:Tlistview;
begin
if Edit1.Text<>'' then
begin
i:=StrToInt(Edit1.Text);
m:=ListviewBinarySearch(ListView1,Item, i);
if m=true then
Memo1.Lines.Add('Результат поиска=: '+'найдено')
else Memo1.Lines.Add('Результат поиска=: '+'не найдено');
end; |
|
#2
|
||||
|
||||
|
Таблица отдельно, ключ отдельно. Почитай как реализованы индексные файлы у dbf-ок, тебе, судя по всему надо что-то подобное.
|
|
#3
|
|||
|
|||
|
Я думаю тут не обязательно надо бд строить... главное чтобы двоичный поиск был осуществлен..
Вот еще один вариант... только он тоже не особо работает я не могу понять почему... =( Код:
function BSearch (item: array of integer; count:integer;
key:integer):boolean;
var
low, high, mid,k: integer;
found:boolean;
begin
k:=0;
low:=1;
high:=count;
found:=false; { не найден }
while (low<=high) and (not found) do
begin
k:=k+1;
mid:=(low+high) div 2;
if key<item[mid] then high:=mid-1
else if key>item[mid] then low:=mid+1
else found:=true; { найден }
end;
if found then BSearch:=true
else BSearch:=false; { не найден }
end; { конец поиска }
procedure TForm1.Button1Click(Sender: TObject);
var i,k,l,c:integer; m:boolean;
a:array[1..20] of integer;
begin
if Edit1.Text<>'' then
begin
Memo1.Clear;
l:=StrToInt(Edit1.Text);
for i:=1 to 20 do
a[i]:=StrToInt(Memo2.Lines[i-1]);
m:= BSearch (a[i],20,l);
if m=true then
begin
Memo1.Lines.Add('Результат поиска=: '+'найдено');
Memo1.Lines.Add('Число сравнений=: '+IntToStr(k));
end
else Memo1.Lines.Add('Результат поиска=: '+'не найдено');
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Clear;
Memo1.Clear;
end;извиняюсь, файл не могу прикрепить... весит много слишком Последний раз редактировалось Athen, 28.05.2009 в 10:02. |
|
#4
|
||||
|
||||
|
А никто и не советовал тебе делать БД. Я советовал тебе прочитать об организации индексных файлов.
|