|
#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
|
||||
|
||||
А никто и не советовал тебе делать БД. Я советовал тебе прочитать об организации индексных файлов.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |