Я ищу высокоэффективную структуру данных для хранения данных, аналогичную следующей.
Идентификационные метки Order1 Order2 -------------------------- 1 1,2 1 1 2 2,5 2 3 3 1,7 4 7 4 6 3 0
Мне нужно иметь возможность запрашивать эту структуру таким образом, чтобы она выдала мне список всех идентификаторов, содержащих выражение тегов - поддержка AND
и OR
и NOT
операции. Например. ((1 или 2) а не 7)
Мне также нужно иметь возможность указать порядок результатов (Order1 или Order2) и указать максимальное количество строк, возвращаемых с необязательным смещением. Производительность для получения первых 30-100 результатов является ключевой.
Наконец, мне нужен дешевый способ поиска «отношений тегов», например, я хочу знать, какие теги «связаны» с тегами (1 ИЛИ 2) и с какой частотой. Это означает, что теги появляются в том же наборе, что и 1 ИЛИ 2 ... упорядоченные по частоте.
Любая идея о том, какая структура данных (или набор структур) будет очень эффективной для такого рода работы?
(Я хотел бы использовать это в качестве доказательства концепции для редизайна тегированных страниц семейства сайтов SE)
Ответы:
Это не совсем ответ об эффективной структуре данных, а скорее проработка комментариев @bbejot и @Kaveh, в которых приводится аргумент для размахивания рукой, почему, учитывая текущий вопрос, мы не должны ожидать чего-то, что делает намного лучше, чем поиск в вся база данных. Аргумент основан на сокращении от SAT, экспоненциальной гипотезе времени и большом количестве размахиваний руками.
Мы не должны ожидать эффективного поиска по длине запроса (путем сокращения до SAT). Мы также не должны ожидать намного лучше, чем смотреть на все элементы в базе данных в соответствии с гипотезой экспоненциального времени.
источник
Это довольно простой ответ, но я считаю эффективным:
Map Tag ([Id],[Id])
Map Id (Set Tag)
Id
источник