Re: поиск подстроки в таблице
- From
- Alexander Krotoff ()
- To
- Valentin Davydov
- Date
- 2002-05-02T20:24:56Z
- Area
- RU.ALGORITHMS
From: krotoff@such.srcc.msu.su (Alexander Krotoff)
Valentin Davydov <val@sqdp.trc-net.co.jp> wrote:
>>Задачка такая: есть таблица слов, необходимо организовать поиск
>>подстроки, точнее подслова в таблице. Вопрос в том, какова должна
>>быть структура таблицы, чтобы поиск был максимально эффективным.
>>Например если заранее известно, что искомое слово является префиксом
>>(или суффиксом), то можно воспользоваться бинарным деревом.
>>А если общий случай - поиск в середине слова? Можно взять алгоритм
>>типа Морриса-Пратта, но тогда придется линейно просматривать всю
>>таблицу.
>>Существует ли какое-то более красивое решение?
VD> Если памяти не жалко, а таблица статичная (словарь), то можно хранить
VD> таблицы хэшей (т.е. 256 массивов индексов слов, содержащих данную букву,
VD> 65536 массивов индексов слов, содержащих данное буквосочентание и т.д.).
Как вариант (если таблица небольшая, меняется редко, а искать подстроки
нужно часто и быстро).
struct {
int i, j, p;
const char *str;
};
создаешь списк структур такого вида. Для каждой iой jой клетки таблицы
strlen(table[i][j]) структур. Член str каждой pой структуры указывает
на p-ый символ в строке table[i][j].
Затем этот список сортируешь по полю str (лексикографический порядок
строк). Подстроку ищешь бинарным поиском в получившемся списке, либо,
если искать нужно _очень_ быстро, строишь над структурами один из
вариантов дерева поиска (те же B-деревья).
Если нужен качественный результат - есть подстрка или нет - поля i,j,p
структуры не нужны. Если нужно находить подстроку с точностью до
клетки в таблице - не нужно поле p.
--
Успехов,
Саша.
--- ifmail v.2.15dev5
* Origin: Он знал Сашу Бло. (2:5020/400)