У меня есть приложение, в котором у меня есть несколько наборов.Набор может быть
{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 & data) == set).Он работает и экономит место, но работает медленно (O (n)), и я был бы рад обменять часть памяти на некоторую производительность.У кого-нибудь есть идеи о том, как это организовать?
Редактировать: Большое спасибо за все ответы.Похоже, мне нужно предоставить больше информации о проблеме.Сначала я получаю наборы, а затем по одному получаю элементы данных.Мне нужно проверить, соответствует ли элемент данных одному из наборов.
Наборы, скорее всего, будут «слипшимися», например, для данной задачи 1, 3 и 9 могут содержаться в 95% наборов;Я могу предсказать это до некоторой степени заранее (но не очень хорошо).
Для тех, кто предлагает запоминание: это структура данных для запомненной функции.Наборы представляют общие решения, которые уже были вычислены, а элементы данных являются новыми входными данными для функции.Сопоставляя элемент данных с общим решением, я могу избежать большой обработки.