<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.70.46.27&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.70.46.27&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/178.70.46.27"/>
		<updated>2026-08-02T21:44:14Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_LZMA&amp;diff=57793</id>
		<title>Алгоритм LZMA</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_LZMA&amp;diff=57793"/>
				<updated>2016-12-13T10:51:55Z</updated>
		
		<summary type="html">&lt;p&gt;178.70.46.27: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;LZMA (англ. Lempel-Ziv-Markov chain-Algorithm) — это алгоритм, используемый для выполнения сжатия без потерь. Он разрабатывался с 1996-1998 гг и впервые был использован в формате 7z архиватора 7-Zip.Алгоритм использует словарное сжатие , в чем-то схожее с алгоритмом LZ77.&lt;br /&gt;
&lt;br /&gt;
==Описание==&lt;br /&gt;
LZMA использует алгоритм словарного сжатия, выходные данные которого закодированы интервальным кодированием, использующим сложную модель вычисления вероятности появления каждого бита. Система сжатия находит соответствия, используя словарную структуру данных, и создает поток символов и ссылок фраз, уже находящихся в словаре, который закодирован 1 битом интервальным кодировщиком.&lt;br /&gt;
&lt;br /&gt;
Главной инновацией LZMA было то, что вместо общей байтовой модели, модель LZMA использовала зависящие от контекста битовые поля в каждом представлении букв или фраз. Эта модель почти также проста как битовая, но дает лучший коэффициент сжатия, потому что избегает смешивания несвязных битов вместе в том же самом контексте.&lt;br /&gt;
&lt;br /&gt;
==Основные преимущества==&lt;br /&gt;
*Высокий коэффициент сжатия.&lt;br /&gt;
*Изменяемый размер словаря.&lt;br /&gt;
*Небольшие требования по памяти для “распаковки” данных.&lt;br /&gt;
&lt;br /&gt;
==Схема кодирования==&lt;br /&gt;
В дополнении к алгоритмам, используемым в LZ77, LZMA использует Дельта-фильтр и интервальное кодирование.&lt;br /&gt;
[[Файл:Lzma3.png]]&lt;br /&gt;
&lt;br /&gt;
==Дельта-кодирование и декодирование==&lt;br /&gt;
Дельта фильтр перестраивает входные данные для эффективного сжатия скользящим окном. Первый байт на выходе совпадает с первым байтом на входе, последующие же байты представлены как разность между текущим и предыдущим байтом. Для постоянно меняющихся данных, дельта-кодирование делает работу скользящего окна более эффективной.&lt;br /&gt;
&lt;br /&gt;
===Пример===&lt;br /&gt;
  Входная последовательность: 2,3,4,6,7,9,8,7,5,3,4&lt;br /&gt;
  Закодированная последовательность: 2,1,1,2,1,2,-1,-1,-2,-2,1&lt;br /&gt;
  Количество различных символов в входных данных: 8&lt;br /&gt;
  Количество различных символов после кодирования:4&lt;br /&gt;
&lt;br /&gt;
===Кодер и декодер===&lt;br /&gt;
====Кодер==== &lt;br /&gt;
&lt;br /&gt;
1. функция принимает массив и длину массива как аргументы, если длина не была передана, то массив не обрабатывается.&amp;lt;br/&amp;gt;&lt;br /&gt;
2. инициализируются переменные tmp, для сохранения последнего элемента и last для хранения предыдущего числа.&lt;br /&gt;
инициализация цикла, где i это счетчик.&amp;lt;br/&amp;gt;  &lt;br /&gt;
3. В цикле: &amp;lt;br/&amp;gt;&lt;br /&gt;
* 3.1 сохранение символа под номером i в массиве &amp;lt;br/&amp;gt;&lt;br /&gt;
* 3.2 вычисление разницы между элементом под номером i и i-1, первый элемент не меняется, и присвоение разницы     этому элементу.&amp;lt;br/&amp;gt; &lt;br /&gt;
 '''function''' delta_encode(bp: '''char*''', n: '''int''')&lt;br /&gt;
    '''char''' last=0,''tmp&lt;br /&gt;
    '''for''' i=0 '''to''' n-1&lt;br /&gt;
        tmp=bp[i]&lt;br /&gt;
        bp[i]-=last&lt;br /&gt;
        last=tmp&lt;br /&gt;
====Декодер====&lt;br /&gt;
1.инициализация переменной для хранения последнего символа.&amp;lt;br/&amp;gt;&lt;br /&gt;
2.инициализация цикла, где i это счетчик.&amp;lt;br/&amp;gt;&lt;br /&gt;
3.В цикле:&amp;lt;br/&amp;gt;&lt;br /&gt;
*3.1добавление к этому элементу значение предыдущего элемента.&lt;br /&gt;
*3.2сохранение значение этого элемента.&lt;br /&gt;
   '''function''' delta_encode(bp:'''char*''', n:'''int''')&lt;br /&gt;
     '''char''' last=0&lt;br /&gt;
     '''for'''i=0 '''to''' n-1 &lt;br /&gt;
         bp[i]+=last&lt;br /&gt;
         last=bp[i]&lt;br /&gt;
==Модель &amp;quot;скользящего&amp;quot; окна==&lt;br /&gt;
Модель скользящего окна идентичен алгоритму LZ77&lt;br /&gt;
==Интервальное кодирование==&lt;br /&gt;
При интервальном кодировании все символы сообщения кодируются как одно число, для того чтобы достичь наилучшего коэффициента сжатия. Это работает эффективно с вероятностями появления символа не являющимися степенями двойки.&lt;br /&gt;
Интервальное кодирование работает так:&amp;lt;br/&amp;gt;&lt;br /&gt;
1. Выделяется достаточно большой диапазон целых чисел и дается оценка вероятности вхождения для символов.&amp;lt;br/&amp;gt;&lt;br /&gt;
2. Исходный диапазон чисел делится на поддиапазоны, размер которых пропорционален вероятности вхождения символа, за который они отвечают.&amp;lt;br/&amp;gt;&lt;br /&gt;
3. Каждый символ сообщения кодируется, после чего диапазон сокращается до размера диапазона только что закодированного символа и вновь делится по вероятностям.&amp;lt;br/&amp;gt;&lt;br /&gt;
В декодере должны быть такое же распределение вероятностей как и при кодировании.&lt;br /&gt;
== Пример ==&lt;br /&gt;
Закодируем строку &amp;lt;tex&amp;gt;abehhilopsu&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Для начала пропустим ее через дельта фильтр.&amp;lt;br/&amp;gt;&lt;br /&gt;
Тогда исходная строка &amp;lt;tex&amp;gt;abehhilopsu&amp;lt;/tex&amp;gt; примет вид: &amp;lt;tex&amp;gt;97&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;. Как мы видим, теперь в нашей строке вместо 10 различных символов 5 различных символа.&amp;lt;br/&amp;gt;&lt;br /&gt;
Далее применим к получившейся строке метод &amp;quot;скользящего окна&amp;quot;:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; &lt;br /&gt;
 !Сообщение&lt;br /&gt;
 !Подстрока&lt;br /&gt;
 !Код&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tex&amp;gt;\fbox{971330}133132 &amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&lt;br /&gt;
 |&amp;lt;0,0,&amp;lt;tex&amp;gt;97&amp;lt;/tex&amp;gt;&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tex&amp;gt;97\fbox{13301}33132&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&lt;br /&gt;
 |&amp;lt;0,0,&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tex&amp;gt;971\fbox{33013}3132&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&lt;br /&gt;
 |&amp;lt;0,0,&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tex&amp;gt;9713\fbox{30133}132&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;1,1,&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tex&amp;gt;971330\fbox{13313}2&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;133&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;4,3,&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |&amp;lt;tex&amp;gt;9713301331\fbox{32}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |&amp;lt;2,1,&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;gt;&lt;br /&gt;
 |}&lt;/div&gt;</summary>
		<author><name>178.70.46.27</name></author>	</entry>

	</feed>