Я прочитал ваш вопрос как: «данное двоичное число с некоторыми битами всегда установлено, создайте оставшиеся возможные двоичные числа».
Например, учитывая 1xx1: вы хотите: 1001, 1011, 1101, 1111.
Алгоритм O(N) выглядит следующим образом.
Предположим, что биты определены в маске m. У вас также есть хэш h.
Чтобы сгенерировать числа ‹ n-1, в псевдокоде:
counter = 0
for x in 0..n-1:
x' = x | ~m
if h[x'] is not set:
h[x'] = counter
counter += 1
Идея кода состоит в том, чтобы пройтись по всем числам от 0 до n-1 и установить предопределенные биты в 1. Затем запомнить полученное число (если оно еще не запомнено), сопоставив полученное число со значением бегущей строки. прилавок.
Ключи h будут перестановками. В качестве бонуса h[p] будет содержать уникальный порядковый номер для перестановки p, хотя он вам не понадобился в исходном вопросе, он может быть полезен.
person
Slinky
schedule
24.08.2010