Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2011, 00:35   #1
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию Более правильный и быстрый алгоритм "быстрого поиска"...?

Всем привет.
Тема не касается именно одного языка...Код в примере на Delphi - для быстрой проверки алгоритма...
Вобщем нужен эдакий быстрый поиск, то ли фильтрация...вобщем смысл в чем - есть список названий чего либо, ну для примера пусть будут названия книг, хранятся они в текстовом файле. В программе пользователь, например в Edit, начинает вводить название книги, и по мере набора пользователю всего лишь нужно будет отображать подсказки в виде DropDown списка под Edit"ом.
Самое первое, что пришло на ум - это просто перебор в цикле по событию Change Эдита:
Код:
procedure TForm1.Edit1Change(Sender: TObject);
var
  i: Integer;
begin
  // Очистка DropDown списка от предыдущих результатов...
  for i := 0 to lst.Count - 1 do
  begin
    if Pos( LowerCase(Edit1.Text), LowerCase(lst.Strings[i]) ) > 0 then
      // Добавление подходящих результатов lst.Strings[i] в DropDown список
  end;
end;
Но в действительности, что-то не особо мне нравится данный алгоритм, уж слишком простой и долгий...
Так вот, может есть специальные алгоритмы для реализации вот такого "быстрого поиска" (фильтрации)?
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 21.09.2011, 08:32   #2
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Ну если предположить что названия книг выглядят так:
Кухня
Советы и рецепты
Мы под водопадом

И поиск считает точное совпадение, а не ищет по отдельным словам. То попробовать отсортировать в алфавитном порядке например. И дальше в поиске, если совпадений нет то заканчиваем поиск, есть продолжаем. Ну и глянуть внутрь как реализован внутри stringlist метод IndexOf или метод Find.

Последний раз редактировалось dr.Chas; 21.09.2011 в 08:35.
dr.Chas вне форума Ответить с цитированием
Старый 21.09.2011, 08:36   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А входимость проверяется именно в любом месте строки, а не сначала? При таком подходе мало вероятно, что более быстрый алгоритм найдется. Можно загнать список строк в ClientDataSet и использовать фильтрацию и DBComboBox, быстрей не будет, но симпатичней.

ADD

Можно вместо StringList просто массив строк использовать - чуток побыстрей будет наверно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.09.2011 в 09:17.
Аватар вне форума Ответить с цитированием
Старый 21.09.2011, 08:38   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Тема не касается именно одного языка...
Цитата:
Более правильный и быстрый алгоритм "быстрого поиска"...?
В таком случае тема теряет смысл во второй части. Быстрота алгоритма в не малой степени зависит от языка и конкретного компилятора.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 21.09.2011, 08:48   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Я уже где-то писал о подомном. Делал так:
Разбил файл, на отдельные файлы по-алфавиту и внёс в них все данные.
При наборе первой буквы в Edit-е, открывался файл с нужной начальной буквой, а потом происходил поиск внутри этого файла обычным способом.
Громоздко, но получилось довольно шустро.

Ещё способ.
Делается вторичный файл и в него записываются адреса строк первичного файла, с которого начинается отсчёт первой буквы.
Концом алфавита, является ссылка на следующую строку.
Например:
А=1
Б=15
В=25
и т.д.
Можно список ссылок включить в этот-же файл (с начала файла).
Сложность этого метода в том, что при дополнении списка, необходимо менять инфу во-вторичном файле.
Цитата:
Сообщение от Utkin Посмотреть сообщение
В таком случае тема теряет смысл во второй части. Быстрота алгоритма в не малой степени зависит от языка и конкретного компилятора.
Смысл в том, что нужно найти наиболее быстрый алгоритм, а не увеличить скорость работы алгоритма, за счёт выбора языка.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 21.09.2011 в 08:56.
Smitt&Wesson вне форума Ответить с цитированием
Старый 21.09.2011, 23:06   #6
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Спасибо всем ответившим.
Направление, что искать и пробовать - ясно + нашел еще некоторую информацию.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правильный результат разности полей содержащих "NULL" KBO БД в Delphi 2 06.08.2011 02:55
Правильный параметр "командная строка" в макрокоманде "ЗапускПриложения". peektoseen Microsoft Office Access 3 10.03.2010 19:53
"Быстрый вызов" action-ов data модуля из другово окна Altera Общие вопросы Delphi 0 22.09.2009 16:05
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
мысли в слух или "быстрый режим" в работе с БД Квэнди Свободное общение 2 08.02.2007 09:38