Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.05.2009, 15:05
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
По умолчанию двоичный поиск

нужно сделать таблицу из 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  
Старый 27.05.2009, 15:50
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Таблица отдельно, ключ отдельно. Почитай как реализованы индексные файлы у dbf-ок, тебе, судя по всему надо что-то подобное.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 28.05.2009, 09:52
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
Печаль

Я думаю тут не обязательно надо бд строить... главное чтобы двоичный поиск был осуществлен..
Вот еще один вариант... только он тоже не особо работает я не могу понять почему... =(
Код:
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  
Старый 28.05.2009, 13:55
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А никто и не советовал тебе делать БД. Я советовал тебе прочитать об организации индексных файлов.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter