748
правок
Изменения
Нет описания правки
== Алгоритм получения цепного кода для двоичных векторов ==
В качестве первого вектора берём вектор из <tex>n</tex> нулей. Чтобы получить следующий вектор, берём последний добавленный вектор, пусть <tex>a_1\cdots dots a_n</tex>. Если в коде до этого не встречатся вектор <tex>a_2\cdots dots a_n 1</tex>, то добавляем его. Иначе проверяем на наличие в коде вектора <tex>a_2\cdots dots a_n 0</tex>. Если такой не встречался, добавляем его. Если вектор уже встречался, значит, генерация кода закончена.
== Псевдокод алгоритма ==
===Доказательство первого пункта===
Покажем, что единственная ситуация, когда требуется сгенерировать новый вектор, а оба возможных варианта (добавление нуля или единицы) уже добавлены — сгенерирован вектор из <tex>n</tex> нулей. Рассмотрим первое такое противоречие: последним добавлен вектор <tex>a_1 a_2 \cdots dots a_n</tex>, вектора <tex>a_2 \cdots dots 1</tex> и <tex>a_2 \cdots dots a_n 0</tex> уже присутствуют в коде.
Далее есть две возможных ситуации: вектор <tex>a_2 \cdots dots a_n 0</tex> состоит из <tex>n</tex> нулей или предшествовал другому вектору в коде. В первой ситуации алгоритм завершает работу.
Во второй сутиации каждому из векторов <tex>a_2 \cdots dots a_n 1</tex> и <tex>a_2 \cdots dots a_n 0</tex> предшествовали некоторые вектора в коде, пусть <tex>B_1 = b_1 a_2 \cdots dots a_n</tex> и <tex>B_2 = b_2 a_2 \cdots dots a_n</tex>. Так как мы рассматриваем первое противоречие, то <tex>b_1 \neq b_2</tex>.
Но в таком случае вектор <tex>a_1 a_2 \cdots dots a_n</tex> совпадает с одним из векторов <tex>B_1</tex> или <tex>B_2</tex>. Это противоречит предположению о том, что рассмотренная конфликтная ситуация является первой, следовательно, реализуется только первый вариант ситуации.
===Доказательство второго пункта===
Покажем, что до генерации веткора из <tex>n</tex> нулей генерируются все остальные битовые вектора. Допустим, мы всё же получили вектор из всех нулей раньше, чем перебрали все вектора. Тогда рассмотрим множество векторов <tex>Z</tex>, которые не были сгенерированы алгоритмом и оканчиваются на ноль.
Пусть <tex>a_1 a_2 \cdots dots a_{n - 1} 0 \in Z</tex>. Докажем, что <tex>a_2 \cdots dots a_{n - 1} 0 \in Z</tex>. От противного, пусть вектор <tex>a_2 \cdots dots a_{n - 1} 0 0 </tex> был сгенерирован. Тогда ему предшествовал вектор <tex>b_1 a_2 \cdots dots a_{n - 1} 0</tex>. Так как по предположению <tex>b_1 \neq a_1</tex>, то в коде может быть только один вектор такого вида, а в таком случае алгоритм может сгенерировать только <tex>a_2 \cdots dots a_{n - 1} 0 1</tex>.
Значит, если множество <tex>Z</tex> непусто, то оно содержит вектор из <tex>n</tex> нулей. Но это противоречит тому, что вектор из <tex>n</tex> нулей был сгенерирован. Следовательно, это предположение не верно и все вектора с нулём в последней позиции были сгенерированы.
Пусть был сгенерирован вектор <tex>a_1 \cdots dots a_{n - 1} 0</tex>. Ему предествовал некоторый вектор <tex>b_1 a_1 \cdots dots a_{n - 1}</tex>. Так как алгоритм сначала пытается поместить в код вектор <tex>a_1 \cdots dots a_{n - 1} 1</tex>, то на этом шаге вектор <tex>a_1 \cdots dots a_{n - 1} 1</tex> уже присутсовал в коде. Предыдущее рассуждение показывает, что всякий вектор вида <tex>a_1 \cdots dots a_{n - 1} 0</tex> был добавлен в код, а значит, и вектор вида <tex>a_1 \cdots dots a_{n - 1} 1 </tex> также был добавлен в код. Таким образом, все двоичные вектора присутсвуют в сгенерированном коде.
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Комбинаторика ]]