Ваши «символы» могут быть интерпретированы как термины в традиционном И-запросе поисковой системы.
Из этого комментария:
все подпоследовательности abcd, такие как a,b,c,d,ab, ac, ad, bc, bd,cd , abc, abd, acd, abcd и т. д., при запросе должны возвращать подкарту с abcd -> obj1 как один из его входов.
Мы могли бы интерпретировать это с документом, содержащим термины Aspid Beaver Cherokee Deer (ABCD), документ должен быть возвращен при поиске любого из его слов или любой из их комбинаций.
Для этого вам нужно построить инвертированный индекс. Подробнее см. в этом ответе. По сути, вы должны построить HashMap
или таблицу поиска (символов не так много) для каждого «символа» (=термин на языке поисковой системы), где поиск вернет все objX
, где он появляется (=документ на языке поисковых систем), в идеале в порядке возрастания.
Чтобы найти все объекты, связанные с набором символов, вы должны объединить наборы для каждого отдельного символа. Поскольку они упорядочены, вы можете вычислить пересечение множества за линейное время.
Если запрос ba
должен не совпадать с ключом abc
, вы можете уточнить таблицу поиска / HashMap
для хранения позиций символов (например: сохранить «b находится в Obj1 в позиции 0», «a найдено в Obj1 в позиции 1", вместо того, чтобы отбрасывать позиции). При вычислении поискового пересечения вы будете действовать в порядке поиска и отбрасывать совпадения с неправильным относительным порядком.
Это обычная практика для поисковых систем, и она была тщательно проанализирована с точки зрения производительности.
Изменить: Производительность
Если количество отдельных «терминов» невелико (например: 26 строчных английских букв), вы можете ускорить это, добавив n-граммы в качестве терминов (где для «abc» вы должны добавить «a», «b» , «с», «аб», «ас», «бк» и «абв»). Применяются те же правила - с половиной поисков и, поскольку ожидается перекрытие, можно использовать трюк Саши, чтобы избежать хранения индексов.
person
tucuxi
schedule
20.04.2015
bc
должна ли ваша карта возвращать первую и третью записи? - person Alex Salauyou   schedule 20.04.2015da
также является двухсимвольной перестановкойabcd
- person Alex Salauyou   schedule 20.04.2015ac
можно получить изabcd
, удаливb
иd
. - person Alex Salauyou   schedule 20.04.2015String
ссылки, указывающие на одно и то же значение. Размер одной записи вHashMap
составляет 24 байта. - person Alex Salauyou   schedule 20.04.2015HashMap
нужно26^2 * (4 + 32)
= 24К байт для ключей иs^2/2*24*N
для значений, где N — количество слов, s — длина слова. Для s = 6 это768 * N
байта, не так уж и много. - person Alex Salauyou   schedule 20.04.2015s * (s - 1) / 2 = 45
- person Alex Salauyou   schedule 20.04.2015HashMap.Entry
) + 4 (2 символа) + 32 (размерString
) байт. И каждое ключевое слово должно быть сохранено как полная строка once, потому что индексная карта будет содержать ссылки на ключString
, а не на сам массив байтов. - person Alex Salauyou   schedule 20.04.2015