Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как оптимальнее сделать поиск?

248
23 июня 2009 года
Dmitry2064
590 / / 06.12.2006
Задача. Сопоставить тексту заголовка файл-картинку.
Предполагаю три варианта работы.
1. Сделать текстовый документ, в котором сопоставить каждому заголовку свой файл с иллюстрацией и потом обращаться к такому файлу и считывать построчно, пока текст в строке не будет похож (If Instr...) на название заголовка, вытащенного из документа. Тогда считать сл. строку, где сидит путь к картинке.
2. По названию заголовка искать в папке с картинками файл с похожим названием.
3. Прописать в самом коде соответствия названия заголовка и названий файла-иллюстрации. В данном варианте придется написать оч. много строк кода.

Вопрос, какой алгоритм будет (или может) работать быстрее?
294
30 июня 2009 года
Plisteron
982 / / 29.08.2003
Из предложенных быстрее всего второй (при условии, что у нас современная файловая система, например NTFS или EXT3, но не FAT32).
Но зачем делать просто, если можно сложно?
Я бы сделал так:
Прикрутить к программе какую-нибудь встраиваемую СУБД типа SQLite или BerkeleyDB и создать там таблицу из трёх полей: заголовок, CRC32 заголовка и имя файла.
 
Код:
CREATE TABLE my_pictures
(
    title_crc    CHAR(8, 0), // здесь будет значение типа 5F3B0C1A
    title_full   VARCHAR2, -- извините, диалект Oracle
    file_path    VARCHAR2
);
CREATE INDEX my_pictures_by_title_crc ON my_pictures (title_crc);
При поиске файла по заголовку рассчитываем CRC32 заголовка и делаем
 
Код:
SELECT title_full, file_path FROM my_pictures WHERE title_crc = :crc_to_find
. Если выбрана 1 строка, её и используем, если больше -- наличиествует столкновение хэшей, проверяем выборку на соответствие title_full полным перебором результатов выборки (думаю, будет максимум 2 строки, если у тебя этих файлов не миллиарды).

PS. Как только дописал, вспомнил, что пишу в арию "Visual Basic", а не "C++"... Зачем нам встраиваемая БД? У нас есть Jet и ADO!

PPS. Добавил пример. DLL и VB-шный пример собирается в висуальной студии 2008, надо только создать проект Win32 DLL и включить в него все *.cpp и *.h и VB-проект для файлов *.vb. К сожалению, в MS Jet aka Access нету типа данных Unsigned Int, поэтому для хранения crc32 применяется Double.

PPPS. Сырцы для CRC32 взял из Википедии.
294
02 июля 2009 года
Plisteron
982 / / 29.08.2003
Ещё одна вариация на тему.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог