Я не ожидал, что тема продолжится.. Но если тут начали составлять алгоритм для поиска слов конкретного числа "букв" нулей/единиц. То я должен напомнить, что есть алгоритм Дюваля для нахождения
всех слов До заданой длины. Дюваль нашел метод создания лексически следующего слова. Он проходит в три этапа:
Выбираем какое-то слово Линдона, пусть
, бинарный алфавит.
1. Заполняем указаную максимальную длину (
) буквами избранного слова (для
будет
);
2. Если заканчивается на любую букву кроме последней
меняем её на следующую по алфавиту.
3. Если заканчивается на последнюю, то обрезаем ее и возвращаемся на п 2. до того момента, пока п. 2 не сработает(
)
Я работал именно с ним. И отталкивался от него. Сложность - линейная, а если работать с массивами, то может быть вообще
Кажется, вот код, который я получил на Quora (на Python но я не питонист, уж извините):
Код:
def binary_lyndon_words(k, n):
# Make the array 1..n instead of 0..n-1, for each of comparison to the original
w = [None] + [0 for _ in range(n-k)] + [1 for _ in range(k)]
i = n
count = k
while i > 0:
for j in range(1, n-i+1):
count -= w[i+j]
count += w[j]
w[i+j] = w[j]
if i == n and count == k:
yield w[1:]
i = n
while i > 0 and w[i] == 1:
i = i - 1
if i > 0:
count += 1
w[i] = w[i] + 1
Примеры
Код:
>>> list( binary_lyndon_words( 3, 8) )
[[0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 1, 0, 1, 1],
[0, 0, 0, 0, 1, 1, 0, 1],
[0, 0, 0, 1, 0, 0, 1, 1],
[0, 0, 0, 1, 0, 1, 0, 1],
[0, 0, 0, 1, 1, 0, 0, 1],
[0, 0, 1, 0, 0, 1, 0, 1]]
>>> sum( 1 for _ in binary_lyndon_words( 6, 24))
5598
>>> sum( 1 for _ in binary_lyndon_words( 8, 32))
876525 # but takes too long
Могу дать ссылку на источник, там расписано, но... Quora любит рекламу...