проблема
Мне дано N массивов C логических значений. Я хочу организовать их в структуру данных, которая позволит мне выполнить следующую операцию как можно быстрее: для нового массива вернуть true, если этот массив является «надмножеством» любого из сохраненных массивов. Под надмножеством я имею в виду следующее: A является надмножеством B, если A [i] истинно для каждого i, где B [i] истинно. Если B [i] ложно, то A [i] может быть чем угодно.
Или в терминах наборов вместо массивов:
Храните N наборов (каждый с C возможными элементами) в структуре данных, чтобы вы могли быстро найти, является ли данный набор надмножеством любого из сохраненных наборов.
Построение структуры данных может занять как можно больше времени, но поиск должен быть максимально эффективным, и структура данных не должна занимать слишком много места.
Некоторый контекст
Я думаю, что это интересная проблема сама по себе, но для вещи, которую я действительно пытаюсь решить, вы можете предположить следующее:
- N = 10000
- C = 1000
- Хранимых массивов мало
- Найденные массивы являются случайными (поэтому не редкими)
Что я придумала до сих пор
Для поиска O (NC) : Просто выполнить итерацию всех массивов. Хотя это слишком медленно.
Для поиска O (C) : у меня здесь было длинное описание, но, как отметил Амит в комментариях, это был в основном BDD . Несмотря на высокую скорость поиска, он имеет экспоненциальное число узлов. С такими большими N и C, это занимает слишком много места.
Я надеюсь, что между этим решением O (N * C) и O (C) может существовать решение O (log (N) * C), которое не требует экспоненциального пространства.
РЕДАКТИРОВАТЬ: новая идея, которую я придумал
Для поиска O (sqrt (N) C) : Хранить массивы как префикс . При поиске массива A перейдите к соответствующему поддереву, если A [i] = 0, но посетите оба поддерева, если A [i] = 1.
Моя интуиция говорит мне, что это должно составить (среднюю) сложность поиска O (sqrt (N) C), если вы предполагаете, что сохраненные массивы являются случайными. Но: 1. это не так, массивы редки. И 2. это только интуиция, я не могу это доказать.
Я опробую как эту новую идею, так и метод BDD, и посмотрю, какая из двух сработает лучше.
Но тем временем эта проблема не возникает чаще? У него нет имени? Разве не было предыдущего исследования? Такое ощущение, что я заново изобретаю колесо.