У меня есть n элементов в наборе U (предположим, что он представлен массивом размера n). Я хочу найти все возможные способы разбиения множества U на два множества A и B, где |A| + |Б| = н.
Так, например, если U = {a,b,c,d}, комбинации будут такими:
- A = {a} -- B = {b,c,d}
- A = {b} -- B = {a,c,d}
- A = {c} -- B = {a,b,d}
- A = {d} -- B = {a,b,c}
- A = {a,b} -- B = {c,d}
- A = {a,c} -- B = {b,d}
- A = {a,d} -- B = {b,c}
Обратите внимание, что следующие два случая считаются равными, и следует вычислять только один:
Случай 1: A = {a,b} -- B = {c,d}
Случай 2: А = {с, d} -- В = {а, Ь}
Также обратите внимание, что ни одно из множеств A или B не может быть пустым.
Я думаю о том, как реализовать это, просто отслеживая индексы в массиве и перемещая их шаг за шагом. Количество индексов будет равно количеству элементов в множестве A, а множество B будет содержать все оставшиеся неиндексированные элементы.
Мне было интересно, знает ли кто-нибудь о лучшей реализации. Я ищу более высокую эффективность, потому что этот код будет выполняться на довольно большом наборе данных.
Спасибо!