Цепные коды — различия между версиями
Ден (обсуждение | вклад) |
Ден (обсуждение | вклад) |
||
Строка 3: | Строка 3: | ||
== Алгоритм получения цепного кода для двоичного вектора == | == Алгоритм получения цепного кода для двоичного вектора == | ||
− | Для получения цепного кода используется жадный алгоритм. | + | Для получения цепного кода используется жадный алгоритм. Первое слово кода — слово, полностью состоящая из нулей. Образуя каждое следующее слово, мы сдвигаем предыдущее влево на один разряд, отбрасывая старший, затем добавляем в конец 1 и проверяем, не было ли такого слова раньше. Если было, то меняем последнюю единицу на ноль. Повторяем, пока снова не вернемся к первому слову |
====Почему алгоритм работает?==== | ====Почему алгоритм работает?==== | ||
+ | Требуется доказать, что алгоритм не повторит 2 слова в коде до того, как закончит цикл и то, что он переберет все возможные варианты. | ||
+ | |||
Во-первых, в этом алгоритме никогда не будет ситуации, когда нам надо образовать новое слово, а оба возможных вариантов (добавление 0 или 1) уже были использованы. | Во-первых, в этом алгоритме никогда не будет ситуации, когда нам надо образовать новое слово, а оба возможных вариантов (добавление 0 или 1) уже были использованы. | ||
Допустим, мы наткнулись на эту ситуацию в первый раз, то есть уже было 2 слова, которые начинались таким же набором единиц и нулей и отличались только в последнем разряде. Но они были получены из двух слов, которые отличаются только в первом разряде, значит, мы должны были столкнуться с данной ситуацией на шаг раньше, но мы предполагали, что это первый подобный случай и пришли к противоречию. Следовательно, мы не можем столкнуться с данной ситуацией. | Допустим, мы наткнулись на эту ситуацию в первый раз, то есть уже было 2 слова, которые начинались таким же набором единиц и нулей и отличались только в последнем разряде. Но они были получены из двух слов, которые отличаются только в первом разряде, значит, мы должны были столкнуться с данной ситуацией на шаг раньше, но мы предполагали, что это первый подобный случай и пришли к противоречию. Следовательно, мы не можем столкнуться с данной ситуацией. | ||
− | Во-вторых, мы не сможем снова вернуться к слову из всех нулей, пока не переберем все <math>2^n</math> слов, где n — длина слова. | + | Во-вторых, мы не сможем снова вернуться к слову из всех нулей, пока не переберем все <math>2^n</math> слов, где n — длина слова. |
+ | Допустим, мы всё же получили слово из всех нулей раньше, чем перебрали все слова. Тогда разобьём слова, которые не попали в код на две группы: кончающиеся на 1 и кончающиеся на 0. | ||
+ | Докажем, что 2-й группы нет. | ||
+ | Рассмотрим слово {хх..хх}0. Раз его нет в коде, то его конец {х..хх}0 встречается в коде не более одного раза, а следовательно слова {x..xx}00 тоже нет в коде. Так эту цепочку можно продолжить до слова 00..000 и прийти к противоречию. | ||
+ | А раз 2-й группы нет, то не может быть и 1-й, так как если в коде есть слово, кончающееся на 0, то мы не можем получить его, если не было слова с таким же началом, но с единицей в конце. |
Версия 05:58, 12 ноября 2010
Алгоритм получения цепного кода для двоичного вектора
Для получения цепного кода используется жадный алгоритм. Первое слово кода — слово, полностью состоящая из нулей. Образуя каждое следующее слово, мы сдвигаем предыдущее влево на один разряд, отбрасывая старший, затем добавляем в конец 1 и проверяем, не было ли такого слова раньше. Если было, то меняем последнюю единицу на ноль. Повторяем, пока снова не вернемся к первому слову
Почему алгоритм работает?
Требуется доказать, что алгоритм не повторит 2 слова в коде до того, как закончит цикл и то, что он переберет все возможные варианты.
Во-первых, в этом алгоритме никогда не будет ситуации, когда нам надо образовать новое слово, а оба возможных вариантов (добавление 0 или 1) уже были использованы. Допустим, мы наткнулись на эту ситуацию в первый раз, то есть уже было 2 слова, которые начинались таким же набором единиц и нулей и отличались только в последнем разряде. Но они были получены из двух слов, которые отличаются только в первом разряде, значит, мы должны были столкнуться с данной ситуацией на шаг раньше, но мы предполагали, что это первый подобный случай и пришли к противоречию. Следовательно, мы не можем столкнуться с данной ситуацией.
Во-вторых, мы не сможем снова вернуться к слову из всех нулей, пока не переберем все
слов, где n — длина слова. Допустим, мы всё же получили слово из всех нулей раньше, чем перебрали все слова. Тогда разобьём слова, которые не попали в код на две группы: кончающиеся на 1 и кончающиеся на 0. Докажем, что 2-й группы нет. Рассмотрим слово {хх..хх}0. Раз его нет в коде, то его конец {х..хх}0 встречается в коде не более одного раза, а следовательно слова {x..xx}00 тоже нет в коде. Так эту цепочку можно продолжить до слова 00..000 и прийти к противоречию. А раз 2-й группы нет, то не может быть и 1-й, так как если в коде есть слово, кончающееся на 0, то мы не можем получить его, если не было слова с таким же началом, но с единицей в конце.