Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 684

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!

Есть текстовый файл. Нужно проиндексировать его на содержимое, чтобы м.б. затем быстро найти конкретную строку по запросу.

Подскажите решение.

Фамилия Имя Отчество Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Фамилия Имя Отчество (статус: Посетитель)
Вопрос отправлен: 30 июня 2007, 18:52
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Градов Ю.М.

Здравствуйте, Emfs!
Посмотрите, пожалуйста, в приложение. Все легко, Вы быстро разберетесь:

Приложение:
  1. type
  2. TMember = record
  3. name : string[50];
  4. eMail : string[30];
  5. Posts : LongInt;
  6. end;
  7.  
  8. var
  9. Members: array[1..50] of TMember;
  10.  
  11. var
  12. F: file of TMember;
  13.  
  14.  
  15.  
  16. var
  17. F: file of TMember;
  18. begin
  19. AssignFile(F,'members.dat');
  20. Rewrite(F);
  21. try
  22. for i:= 1 to 50 do
  23. write (F, Members[i]);
  24. finally
  25. CloseFile(F);
  26. end;
  27. end;
  28.  
  29.  
  30.  
  31. function ReadStrFmFile(const RecN: integer): string;
  32. var s: string;
  33. begin
  34. AssignFile(F,'members.dat');
  35. Reset(F);
  36. Seek(F, RecN);
  37. read(F, S);
  38. Result := S;
  39. CloseFile(F);
  40. end;
  41.  
  42.  


Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 30 июня 2007, 20:21

Ответ #2. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Emfs!
Прочитать все строки файла подряд, вычислить для каждой строки какой-нибудь простой хэш, вроде crc32 и сохранить в массиве вида (hash | line).
Если файл очень большой, требуется очень быстрый поиск, а время на предподготовку довольно много - тогда отсортировать этот массив по hash.

При поиске строки - вычислить хеш искомой строки, с помощью бинарного поиска найти в массиве элемент с нужным хешем (или любой другой алгоритм поиска по отсортированному массиву), потом обязательно прочитать найденную строку из файла и сравнить с искомой побайтово, поскольну возможны коллизии.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 1 июля 2007, 03:28

Ответ #3. Отвечает эксперт: min@y™

Хочу добавить к предыдущим ответам мою фукнцию, как пример бинарного поиска строки S в отсортированном TListBox (см. приложение). Функция возвращает номер строки или -1, если строка не найдена.

Приложение:
  1. function TMainForm.Search(const S: string): Integer;
  2. var
  3.  
  4. begin
  5. BeginPtr:= 0;
  6. EndPtr:= ListBox.Count - 1;
  7. InProcess:= True;
  8. Screen.Cursor:= crHourGlass;
  9. Application.ProcessMessages;
  10.  
  11. try
  12. repeat
  13. Result:= (BeginPtr + EndPtr) div 2;
  14. if ListBox.Items[Result] = S
  15.  
  16. else begin
  17. if CompareStr(S, ListBox.Items[Result]) < 0
  18. then EndPtr:= Result - 1
  19. else BeginPtr:= Result + 1;
  20. end;
  21.  
  22. until EndPtr < BeginPtr;
  23.  
  24. if EndPtr < BeginPtr
  25. then Result:= -1;
  26. finally
  27. Screen.Cursor:= crDefault;
  28. InProcess:= False;
  29. end;
  30. end;


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 2 июля 2007, 08:21


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:25
Выполнено за 0.03 сек.