Ваши «символы» могут быть интерпретированы как термины в традиционном поисковом движке AND-query.
Из этого комментария:
все подпоследовательности ABCD, таких, как а, Ь, с, d, AB, AC, объявления, Ьс, шд, кд, ABC, ABD, ACD, ABCD и т. д., при запросе, должен возвращать подкачку с abcd -> obj1 в качестве одной из ее записей.
Мы могли бы интерпретировать это, имея документ с термином Aspid Beaver Cherokee Deer (ABCD), документ должен быть возвращен при поиске любого из его слов или любых их комбинаций.
Что вы хотите построить для этого, это inverted index. См. this answer для более подробной информации. По существу, вы бы построили HashMap
или таблицу поиска (не так много символов) для каждого символа (= термин в поисковике), где поиск вернет все objX
, где он появится (= документ в поисковике-говорить), в идеале в порядке возрастания.
Чтобы найти все объекты, связанные с набором символов, вы должны присоединиться к наборам для каждого отдельного символа. Поскольку они упорядочены, вы можете рассчитать множество пересечений в линейном времени.
Если запрашивая ba
должен не матча abc
ключа, вы можете уточнить поиск стола/HashMap
для хранения позиции символов (например .: магазин «б находится в obj1 в положении 0», «а находится в Obj1 в позиции 1 ", вместо того, чтобы отбрасывать позиции). При расчете пересечения поиска вы будете действовать в порядке поиска и отбрасывать совпадения с неправильным относительным порядком.
Это обычное дело для поисковых систем, и оно было проанализировано с точки зрения производительности.
Edit: Производительность
Если число различных «терминов» низкий уровень (например: из 26 строчных латинских букв) вы можете ускорить этот процесс путем добавления н-г в выражении (где, «abc», вы должны добавить «a», «b», «c», «ab», «ac», «bc» и «abc»). Те же правила будут применяться - с половиной поисков, и, поскольку ожидается совпадение, трюк Саши можно использовать, чтобы избежать хранения индексов.
для запроса 'bc', если ваша карта вернется первыми и третьи элементы? –
Ваша терминология неверна. «ac» не является подпоследовательностью «abcd» или «abccd». –
Запрос «ca», если он возвращает 1-ю и 3-ю записи? Или нет? –