Обычно решаю алгоритми c задач на C ++. Есть классная функция next_permutation
, которая позволяет вам перемещаться по всем «перестановкам» последовательности. Если последовательность выглядит как «00110100», next_permutation
даст вам «00111000» (оптимальным образом).
Я нашел пример реализации той же функции в java здесь .
Как это может помочь вам решить вашу проблему: инициализируйте последовательность с помощью n
- m
ведущих нулей, за которыми следуют m
единиц. Используйте вашу генерацию основы маски. После этого выполните next_permutation
. Сложность этого алгоритма n
* subsequence_count
. Это будет значительным улучшением, если вы знаете, что m
следует определенным правилам, но снова вызовет огромное количество результатов, например, если n = 64 и m = 32.