Сначала позволяет решить более простую задачу подсчета количества элементов, отсутствующих в ваших наборах. Эта задача может быть переформулирована в более простой форме - вместо 100 000 наборов вы можете думать о 1 наборе, который содержит все ваши номера. Тогда число элементов, отсутствующих в этом наборе, равно x = 1000000 - len(set)
. Теперь вы можете использовать этот номер x
для подсчета количества комбинаций. С повторениями: x * x
, без повторений: x * (x - 1)
. Поэтому в нижней строке моего ответа стоит поставить все ваши номера в один большой набор и использовать его длину, чтобы найти количество комбинаций с помощью комбинаторики.
Update
Так выше у нас есть способ, чтобы найти число комбинаций, где каждый элемент в комбинации не в какой-либо из множеств. Но вопрос заключался в том, чтобы найти количество комбинаций, где каждая комбинация нет ни на одном из наборов.
Позволяет попытаться решить простую задачу первый:
- ваших наборы не все числа в них, никто не хватают
- каждого числа присутствует ровно в одном наборе, нет дубликатов в наборах
Как бы вы построили такие комбинации над такими множествами? Вы бы просто выбрали два элемента из разных наборов, и полученная комбинация не была бы ни в одном из наборов. Количество таких комбинаций можно пересчитать, используя следующий код (он принимает размеры множеств):
int count_combinations(vector<int>& buckets) {
int result = 0;
for (int i=0; i < buckets.size(); ++i) {
for (int j=i+1; j < buckets.size(); ++j) {
result += buckets[i] * buckets[j];
}
}
return result;
}
Теперь давайте представим, что некоторые номера отсутствуют. Затем мы можем просто добавить дополнительный набор с теми недостающими числами в наши наборы (как отдельный набор). Но нам также нужно учитывать, что при наличии n
отсутствующих номеров были бы n * (n-1)
комбинации, построенные с использованием только этих недостающих чисел. Поэтому следующий код будет производить общее число комбинаций с учетом недостающих номеров:
int missing_numbers = upper_bound - all_numbers.size() - 1;
int missing_combinations = missing_numbers * (missing_numbers - 1);
return missing_combinations + count_combinations(sets, missing_numbers);
Теперь давайте представим, что мы имеем дубликат через два набора: {a, b, c}
, {a, d}
. Какие типы ошибок они будут вводить? Следующие пары: {a, a}
- повторение, {a, d}
- комбинация, которая присутствует во втором комплекте. Итак, как лечить такие дубликаты? Нам нужно полностью исключить их из всех множеств. Даже один экземпляр дубликата даст комбинацию, присутствующую в некотором наборе. Потому что мы можем просто выбрать любой элемент из набора, в котором дубликат был удален, и создать такую комбинацию (в моем примере - если мы сохраним a
в первом наборе, затем выберите d
со второго, чтобы произвести {a, d}
, если мы сохраним a
во втором сете , затем выберите b
или c
с первого, чтобы произвести {a, b}
и {a, c}
). Поэтому дубликаты должны быть удалены.
Update
Однако мы не можем просто удалить все дубликаты, рассмотреть этот контрпример: {a, b}
{a, c}
{d}
. Если мы просто удалим a
, мы приобретем {b}
{c}
{d}
и потеряли информацию о несуществующей комбинации {a, d}
. Рассмотрим другой контрпример: {a, b}
{a, b, c}
{b, d}
. Если мы просто удалим дубликаты, мы получим {c}
{d}
и потеряем информацию о {a, d}
.
Кроме того, мы не можем просто применить такую логику для пар множеств, простого счетчика, например, для чисел < 3: {1, 2}
{1}
{2}
. Здесь количество отсутствующих комбинаций равно 0, но мы будем неправильно подсчитывать {1, 2}
, если мы применим удаление дубликатов в пару наборов. Суть в том, что я не могу придумать хорошую технику, которая поможет правильно обрабатывать повторяющиеся элементы на множестве.
Можем ли мы увидеть ваш текущий путь в [MCVE]? Образец ввода с желаемым выходом будет полезен для понимания вашей ситуации. –
@FirstStep: Он просит лучшего алгоритма. Нет смысла писать псевдокод для поиска с помощью команды bruteforce. – hugomg
Есть ли ограничение на количество элементов в каждом наборе? Откуда у вас эта проблема? Это из соревнований по программированию? У вас есть причина полагать, что это можно решить эффективно? – hugomg