Хитрый алгоритм поиска

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Хитрый алгоритм поиска

Сообщение dr.MIG » 13.03.2009 (Пт) 21:09

В общем пишу функцию поиска (не на VB), критическую по времени (поиск в огрооооомном файле на меееедленном устройстве). Задача в следующем -- есть строка текста (не очень большая -- где-то до 150 символов). Есть строка для поиска (слова, разделённые пробелом). Слова в ней объединяются логикой "И". Т.е. совпадение найдено, только если все фрагменты найдены в строке.
Сейчас алгоритм довольно немудрёный -- строка разбивается по пробелу самописным сплитом. Далее проверяется наличие вхождения каждого из элементов полученного массива в данную строку, если всё совпало, то выводим результат. Это можно оптимизировать выходом из цикла проверки сразу же, если что-то не совпало (сейчас этого нет :oops: ).
Ещё критическим по времени является получение строк из файлов по символу, а так же проблема с кодировкой и отсутствием функции, приводящей кирилические символы к одному регистру (надо для сравнения строк).

Для полного понимания предыстория и обсуждение тут.

У кого-нибудь будут хоть какие-нибудь советы для оптимизации алгоритма? Для меня важна каждая секунда :).
Salus populi suprema lex

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Хитрый алгоритм поиска

Сообщение SLIM » 13.03.2009 (Пт) 23:29

Тебе может помочь здесь чудо-библа Хакера. Но вот как она работает только он сможет рассказать.
Там все оптимальнее некуда как я понял
Пишите жизнь на чистовик.....переписать не удастся.....

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Хитрый алгоритм поиска

Сообщение iGrok » 14.03.2009 (Сб) 0:04

SLIM писал(а):Тебе может помочь здесь чудо-библа Хакера. Но вот как она работает только он сможет рассказать.
Там все оптимальнее некуда как я понял

Неа. Не поможет. Слим, если зайти по ссылке, сразу становится понятно, почему..
Это софтина на java под j2me для мобильника.
label:
cli
jmp label

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Хитрый алгоритм поиска

Сообщение SLIM » 14.03.2009 (Сб) 1:16

iGrok писал(а):Неа. Не поможет. Слим, если зайти по ссылке, сразу становится понятно, почему..
Это софтина на java под j2me для мобильника.

Да это то я видел. Только подумал что есть возможность...хотя ладно, нет так нет... :lol:
Пишите жизнь на чистовик.....переписать не удастся.....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Хитрый алгоритм поиска

Сообщение alibek » 14.03.2009 (Сб) 9:22

Отсортируй слова из строки поиска, проиндексируй их. С каждым словом также будет сопоставлен флаг найденности и счетчик позиций.
Перебирай символы текста, для каждого символа проверяй его наличие в массиве искомых слов, в текущей для слова позиции. Если найдено — увеличивай счетчик позиции. Если счетчик позиций стал больше длины слова, устанавливай флаг найденности и в дальнейшем это слово будет исключено из обработки.
Не факт, что этот способ окажется быстрее — это зависит исходных данных (если искомых слов мало, а текст для поиска большой, то он точно окажется медленнее), однако попробовать можно. У этого способа есть еще то преимущество, что время поиска предсказуемо и зависит от длины текста, в котором ищут.
Lasciate ogni speranza, voi ch'entrate.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Хитрый алгоритм поиска

Сообщение dr.MIG » 16.03.2009 (Пн) 15:50

Спасибо за идею алгоритма, буду пробовать.

И ещё один вопрос, обсуждая который по ссылке выше так и не пришли к единому мнению. Ускорит ли работу поиск по файлу в несколько потоков на устройстве с одним процессором?
Salus populi suprema lex

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Хитрый алгоритм поиска

Сообщение alibek » 16.03.2009 (Пн) 16:39

ИМХО, скорее замедлит.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Хитрый алгоритм поиска

Сообщение Andrey Fedorov » 18.03.2009 (Ср) 2:49

alibek писал(а):ИМХО, скорее замедлит.


Я, кстати, попробовал - сбросить все слова в Recordset и искать по нему.
Собственно сброс из файла 0,7 Mb на моей машине занимает ~3..5 секунд - пока это самый медленный момент, надо соптимизировать (пока все сделано довольно тупо и возможность для оптимизации есть и немалая).
Сам же поиск набора слов в строках выполняется довольно быстро, причем получаем сразу все варианты вхождения, да и вообще все получается просто и удобно...

Но это, конечно, если делать на VB...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: Хитрый алгоритм поиска

Сообщение dr.MIG » 02.04.2009 (Чт) 18:21

Итог: посимвольное чтение из файла на телефоне оказалось слишком медленным, даже если полностью убрать поиск и различные преобразования символов (изменение регистра, правка кодировки).
Решение: есть функция readUTF, которая читает строки из файла, предварительно записанного функцией writeUTF (преобразует строку в UTF и перед ней пишет её длину).
Итог: значительное ускорение скорости на эмуляторе телефона и незначительное на телефоне.
Решение: последний возможный способ чтения — чтение в массив байт. При размере его к примеру 1024, скорость увеличивается в разы, по сравнению с предыдущими способами.
Проблема: полный тупик с регистронезависимым поиском. Перевод исходной строки к одному регистру занимает недопустимо много времени, тем более отсутствуют встроенные функции переводящие регистр для кирилицы. Как вариант — предварительно на компе тупо переписать файл в одном регистре :). Но это хочется оставить на крайний случай. Есть ещё какие варианты (возможность предварительно обработать файл на ПК перед закачкой есть)?
Salus populi suprema lex


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 76

    TopList