Цепные коды — различия между версиями
(→Псевдокод алгоритма) |
(→Доказательство второго пункта) |
||
Строка 46: | Строка 46: | ||
Покажем, что до генерации веткора из <tex>n</tex> нулей генерируются все остальные битовые вектора. Допустим, мы всё же получили вектор из всех нулей раньше, чем перебрали все вектора. Тогда рассмотрим множество векторов <tex>Z</tex>, которые не были сгенерированы алгоритмом и оканчиваются на ноль. | Покажем, что до генерации веткора из <tex>n</tex> нулей генерируются все остальные битовые вектора. Допустим, мы всё же получили вектор из всех нулей раньше, чем перебрали все вектора. Тогда рассмотрим множество векторов <tex>Z</tex>, которые не были сгенерированы алгоритмом и оканчиваются на ноль. | ||
− | Пусть <tex>a_1 a_2 \dots a_{n - 1} 0 \in Z</tex>. Докажем, что <tex>a_2 \dots a_{n - 1} 0 \in Z</tex>. От противного, пусть вектор <tex>a_2 dots a_{n - 1} 0 0 </tex> был сгенерирован. Тогда ему предшествовал вектор <tex>b_1 a_2 \dots a_{n - 1} 0</tex>. Так как по предположению <tex>b_1 \neq a_1</tex>, то в коде может быть только один вектор такого вида, а в таком случае алгоритм может сгенерировать только <tex>a_2 \dots a_{n - 1} 0 1</tex>. | + | Пусть <tex>a_1 a_2 \dots a_{n - 1} 0 \in Z</tex>. Докажем, что <tex>a_2 \dots a_{n - 1} 0 \in Z</tex>. От противного, пусть вектор <tex>a_2 \dots a_{n - 1} 0 0 </tex> был сгенерирован. Тогда ему предшествовал вектор <tex>b_1 a_2 \dots a_{n - 1} 0</tex>. Так как по предположению <tex>b_1 \neq a_1</tex>, то в коде может быть только один вектор такого вида, а в таком случае алгоритм может сгенерировать только <tex>a_2 \dots a_{n - 1} 0 1</tex>. |
Значит, если множество <tex>Z</tex> непусто, то оно содержит вектор из <tex>n</tex> нулей. Но это противоречит тому, что вектор из <tex>n</tex> нулей был сгенерирован. Следовательно, это предположение не верно и все вектора с нулём в последней позиции были сгенерированы. | Значит, если множество <tex>Z</tex> непусто, то оно содержит вектор из <tex>n</tex> нулей. Но это противоречит тому, что вектор из <tex>n</tex> нулей был сгенерирован. Следовательно, это предположение не верно и все вектора с нулём в последней позиции были сгенерированы. | ||
Пусть был сгенерирован вектор <tex>a_1 \dots a_{n - 1} 0</tex>. Ему предествовал некоторый вектор <tex>b_1 a_1 \dots a_{n - 1}</tex>. Так как алгоритм сначала пытается поместить в код вектор <tex>a_1 \dots a_{n - 1} 1</tex>, то на этом шаге вектор <tex>a_1 \dots a_{n - 1} 1</tex> уже присутсовал в коде. Предыдущее рассуждение показывает, что всякий вектор вида <tex>a_1 \dots a_{n - 1} 0</tex> был добавлен в код, а значит, и вектор вида <tex>a_1 \dots a_{n - 1} 1 </tex> также был добавлен в код. Таким образом, все двоичные вектора присутсвуют в сгенерированном коде. | Пусть был сгенерирован вектор <tex>a_1 \dots a_{n - 1} 0</tex>. Ему предествовал некоторый вектор <tex>b_1 a_1 \dots a_{n - 1}</tex>. Так как алгоритм сначала пытается поместить в код вектор <tex>a_1 \dots a_{n - 1} 1</tex>, то на этом шаге вектор <tex>a_1 \dots a_{n - 1} 1</tex> уже присутсовал в коде. Предыдущее рассуждение показывает, что всякий вектор вида <tex>a_1 \dots a_{n - 1} 0</tex> был добавлен в код, а значит, и вектор вида <tex>a_1 \dots a_{n - 1} 1 </tex> также был добавлен в код. Таким образом, все двоичные вектора присутсвуют в сгенерированном коде. | ||
− | |||
== См. также == | == См. также == |
Версия 19:41, 26 декабря 2014
Цепной код (англ. chain code) — это такое упорядочивание двоичных векторов одной длины, каждый следующий столбец которого (можно рассматривать как таблицу из
элементов) получается из предыдущего циклическим сдвигом вверх.Цепной код позволяет исправить все одиночные ошибки при условии, что между любыми двумя ошибочно принятыми имеется по крайней мере три правильно принятых сигнала. Часто используется при передачи данных: видео, мобильной связи.
Содержание
Алгоритм получения цепного кода для двоичных векторов
В качестве первого вектора берём вектор из
нулей. Чтобы получить следующий вектор, берём последний добавленный вектор, пусть . Если в коде до этого не встречался вектор , то добавляем его. Иначе проверяем на наличие в коде вектора . Если такой не встречался, добавляем его. Если вектор уже встречался, значит, генерация кода закончена.При таком построении видно, что элементы таблицы
равны элементамПсевдокод алгоритма
- — последний добавленный битовый вектор
- — список битовых векторов
string[] chain_code(int n): current = '0' * n result = [current] while true prefix = current[2..n] if prefix + '1' not in result current = prefix + '1' else prefix + '0' not in result current = prefix + '0' else break result.append(current) return result
Доказательство корректности
Разобьем доказательство на две части:
- Доказательство того, что один и тот же вектор встречается в коде не более одного раза.
- Доказательство того, что алгоритм перебирает все возможные вектора прежде, чем получит вектор из нулей.
Доказательство первого пункта
Покажем, что единственная ситуация, когда требуется сгенерировать новый вектор, а оба возможных варианта (добавление нуля или единицы) уже добавлены — сгенерирован вектор из
нулей. Рассмотрим первое такое противоречие: последним добавлен вектор , вектора и уже присутствуют в коде.Далее есть две возможных ситуации: вектор
состоит из нулей или предшествовал другому вектору в коде. В первой ситуации алгоритм завершает работу.Во второй сутиации каждому из векторов
и предшествовали некоторые вектора в коде, пусть и . Так как мы рассматриваем первое противоречие, то .Но в таком случае вектор
совпадает с одним из векторов или . Это противоречит предположению о том, что рассмотренная конфликтная ситуация является первой, следовательно, реализуется только первый вариант ситуации.Доказательство второго пункта
Покажем, что до генерации веткора из
нулей генерируются все остальные битовые вектора. Допустим, мы всё же получили вектор из всех нулей раньше, чем перебрали все вектора. Тогда рассмотрим множество векторов , которые не были сгенерированы алгоритмом и оканчиваются на ноль.Пусть
. Докажем, что . От противного, пусть вектор был сгенерирован. Тогда ему предшествовал вектор . Так как по предположению , то в коде может быть только один вектор такого вида, а в таком случае алгоритм может сгенерировать только .Значит, если множество
непусто, то оно содержит вектор из нулей. Но это противоречит тому, что вектор из нулей был сгенерирован. Следовательно, это предположение не верно и все вектора с нулём в последней позиции были сгенерированы.Пусть был сгенерирован вектор
. Ему предествовал некоторый вектор . Так как алгоритм сначала пытается поместить в код вектор , то на этом шаге вектор уже присутсовал в коде. Предыдущее рассуждение показывает, что всякий вектор вида был добавлен в код, а значит, и вектор вида также был добавлен в код. Таким образом, все двоичные вектора присутсвуют в сгенерированном коде.