У меня есть приложение, где у меня есть несколько наборов. Набор может быть
{4, 7, 12, 18}
уникальные номера и все меньше 50.
Затем у меня есть несколько элементов данных:
1 {1, 2, 4, 7, 8, 12, 18, 23, 29}
2 {3, 4, 6, 7, 15, 23, 34, 38}
3 {4, 7, 12, 18}
4 {1, 4, 7, 12, 13, 14, 15, 16, 17, 18}
5 {2, 4, 6, 7, 13, 15}
Элементы данных 1, 3 и 4 соответствуют набору, поскольку они содержат все элементы в наборе.
Мне нужно создать структуру данных, которая является сверхбыстрой при определении того, является ли элемент данных членом набора, включая все члены, входящие в набор (так что элемент данных является супермножество множества). Мои лучшие оценки на данный момент предполагают, что будет меньше 50 000 наборов.
В моей текущей реализации есть мои наборы и данные в виде целых чисел без знака 64 бит и наборов, хранящихся в списке. Затем, чтобы проверить элемент данных, я перебираю список, выполняя сравнение ((set and data) == set). Он работает, и он эффективен по пространству, но медленный (O (n)), и я был бы рад обменять некоторую память на некоторую производительность. Есть ли у кого-нибудь лучшие идеи о том, как организовать это?
Edit:
Большое спасибо за все ответы. Похоже, мне нужно предоставить дополнительную информацию о проблеме. Сначала я набираю набор, а затем получаю элементы данных по одному. Мне нужно проверить, соответствует ли элемент данных одному из наборов.
Наборы, скорее всего, будут "clumpy", например, для данной проблемы 1, 3 и 9 могут содержаться в 95% наборов; Я могу заранее предсказать это заранее (но не очень хорошо).
Для тех, кто предлагает memoization: это структура данных для memoized функции. Наборы представляют собой общие решения, которые уже были вычислены, и элементы данных являются новыми входами в функцию. Совместив элемент данных с общим решением, я могу избежать много обработки.