Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 91, средняя оценка - 4.79
*В*Е*Л*И*К*А*Н*
Заблокирован
#1

Метод сжатия Хаффмана - C++

09.11.2010, 19:09. Просмотров 11562. Ответов 11
Метки нет (Все метки)

Есть Метод сжатия Хаффмана или нет и как его использовать ?
покажите если можите ? ну те кто уже знает !
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2010, 19:09     Метод сжатия Хаффмана
Посмотрите здесь:

Метод сжатия Хаффмана - C++
Ктонибуть ответит по существу по теме ?

помогите с реализацией алгоритма сжатия Хаффмана - C++
помогите с реализацией алгоритма сжатия Хаффмана есть код в с++ в консольном приложении, помогите сделать в форме, и чтоб выводило в...

zlib метод\уровень сжатия - C++
Как менять метод и уровень сжатия при этом применяя api?

Метод сжатия строк, основанный на повторяющихся символах - C++
Можете помочь написать программу на C++, доп. библиотек использовать нельзя Для управления котами центральный компьютер посылает им...

Метод хаффмана (Помогите адаптировать под задание) - C++
Может уже кто-то знаком с этим методом кодирования букв. Помогите адаптировать код представленный ниже к заданию (В задании другой язык, но...

Алгоритмы сжатия - C++
Доброго всем времени суток. Интересует такой вопрос. Можете посоветовать какую-нибудь подробную литературу по алгоритмам сжатия данных на...

Алгоритм сжатия LZ - C++
Если у кого есть, поделитесь кодом, пожалуйста:-/

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
10.11.2010, 19:44     Метод сжатия Хаффмана #2
Есть такой метод, самый элементарный, с него обычно начинают курс кодирования информации, почитай
*В*Е*Л*И*К*А*Н*
Заблокирован
12.11.2010, 23:08  [ТС]     Метод сжатия Хаффмана #3
да это я знаю я не пайму как его используют как встовляют или что с ним делают для того чтобы сократить написание ?
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.11.2010, 00:44     Метод сжатия Хаффмана #4
*В*Е*Л*И*К*А*Н*, если Вы прочитали и ничего не поняли, то как Вы предлагаете Вам помочь? Потратить уйму времени, чтобы объснить один из самых известных алгоритмов сжатия, описанный ни один раз?
*В*Е*Л*И*К*А*Н*
Заблокирован
13.11.2010, 13:42  [ТС]     Метод сжатия Хаффмана #5
где описанный и если можно объясните ?

Добавлено через 2 минуты
может это :LZ77 и LZ78 — алгоритмы сжатия без потерь, опубликованные в статьях Абрахама Лемпеля (англ. Abraham Lempel) и Якоба Зива (англ. Jacob Ziv) в 1977 и 1978 годах. Эти алгоритмы наиболее известные варианты в семействе LZ*, которое включает в себя также LZW, LZSS, LZMA и другие алгоритмы.

Оба алгоритма относятся к словарным методам, в отличие от других методов уменьшения избыточности, таких как RLE и арифметическое сжатие. LZ77 является алгоритмом со «скользящим окном», что эквивалентно неявному использованию словарного подхода, впервые предложенного в LZ78. ?
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
13.11.2010, 19:21     Метод сжатия Хаффмана #6
http://ru.wikipedia.org/wiki/Алгоритм_Хаффмана
*В*Е*Л*И*К*А*Н*
Заблокирован
13.11.2010, 22:22  [ТС]     Метод сжатия Хаффмана #7
Код Хаффмана
[править]
Материал из Википедии — свободной энциклопедии
(Перенаправлено с Алгоритм Хаффмана)

Алгоритм Хаффмана — адаптивный жадный алгоритм оптимального префиксного кодирования алфавита с минимальной избыточностью. Был разработан в 1952 году аспирантом Массачусетского технологического института Дэвидом Хаффманом при написании им курсовой работы. В настоящее время используется во многих программах сжатия данных.

В отличие от алгоритма Шеннона — Фано, алгоритм Хаффмана остаётся всегда оптимальным и для вторичных алфавитов m2 с более чем двумя символами.

Этот метод кодирования состоит из двух основных этапов:
Построение оптимального кодового дерева.
Построение отображения код-символ на основе построенного дерева.Содержание [убрать]
1 Кодирование Хаффмана
2 Адаптивное сжатие
3 Переполнение
4 Масштабирование весов узлов дерева Хаффмана
5 Применение
6 Примечания
7 Литература
8 Ссылки

[править]
Кодирование Хаффмана

Один из первых алгоритмов эффективного кодирования информации был предложен Д. А. Хаффманом в 1952 году. Идея алгоритма состоит в следующем: зная вероятности вхождения символов в сообщение, можно описать процедуру построения кодов переменной длины, состоящих из целого количества битов. Символам с большей вероятностью присваиваются более короткие коды. Коды Хаффмана имеют уникальный префикс, что и позволяет однозначно их декодировать, несмотря на их переменную длину.

Классический алгоритм Хаффмана на входе получает таблицу частот встречаемости символов в сообщении. Далее на основании этой таблицы строится дерево кодирования Хаффмана (Н-дерево). [1]
Символы входного алфавита образуют список свободных узлов. Каждый лист имеет вес, который может быть равен либо вероятности, либо количеству вхождений символа в сжимаемое сообщение.
Выбираются два свободных узла дерева с наименьшими весами.
Создается их родитель с весом, равным их суммарному весу.
Родитель добавляется в список свободных узлов, а двое его детей удаляются из этого списка.
Одной дуге, выходящей из родителя, ставится в соответствие бит 1, другой — бит 0.
Шаги, начиная со второго, повторяются до тех пор, пока в списке свободных узлов не останется только один свободный узел. Он и будет считаться корнем дерева.

Допустим, у нас есть следующая таблица частот:15 7 6 6 5
А Б В Г Д


Этот процесс можно представить как построение дерева, корень которого — символ с суммой вероятностей объединенных символов, получившийся при объединении символов из последнего шага, его n0 потомков — символы из предыдущего шага и т. д.

Чтобы определить код для каждого из символов, входящих в сообщение, мы должны пройти путь от листа дерева, соответствующего этому символу, до корня дерева, накапливая биты при перемещении по ветвям дерева. Полученная таким образом последовательность битов является кодом данного символа, записанным в обратном порядке.

Для данной таблицы символов коды Хаффмана будут выглядеть следующим образом.А Б В Г Д
0 100 101 110 111


Поскольку ни один из полученных кодов не является префиксом другого, они могут быть однозначно декодированы при чтений их из потока. Кроме того, наиболее частый символ сообщения А закодирован наименьшим количеством битов, а наиболее редкий символ Д — наибольшим.

Классический алгоритм Хаффмана имеет один существенный недостаток. Для восстановления содержимого сжатого сообщения декодер должен знать таблицу частот, которой пользовался кодер. Следовательно, длина сжатого сообщения увеличивается на длину таблицы частот, которая должна посылаться впереди данных, что может свести на нет все усилия по сжатию сообщения. Кроме того, необходимость наличия полной частотной статистики перед началом собственно кодирования требует двух проходов по сообщению: одного для построения модели сообщения (таблицы частот и Н-дерева), другого для собственно кодирования.
[править]
Адаптивное сжатие

Адаптивное сжатие позволяет не передавать модель сообщения вместе с ним самим и ограничиться одним проходом по сообщению как при кодировании, так и при декодировании.

В создании алгоритма адаптивного кодирования Хаффмана наибольшие сложности возникают при разработке процедуры ОбновитьМодельСимволом(); можно было бы просто вставить внутрь этой процедуры полное построение дерева кодирования Хаффмана. В результате мы получили бы самый медленный в мире алгоритм сжатия, так как построение Н-дерева — это слишком большая работа и производить её при обработке каждого символа неразумно. К счастью, существует способ модифицировать уже существующее Н-дерево так, чтобы отобразить обработку нового символа.

Обновление дерева при считывании очередного символа сообщения состоит из двух операций.

Первая — увеличение веса узлов дерева. Вначале увеличиваем вес листа, соответствующего считанному символу, на единицу. Затем увеличиваем вес родителя, чтобы привести его в соответствие с новыми значениями веса у детей. Этот процесс продолжается до тех пор, пока мы не доберемся до корня дерева. Среднее число операций увеличения веса равно среднему количеству битов, необходимых для того, чтобы закодировать символ.

Вторая операция — перестановка узлов дерева — требуется тогда, когда увеличение веса узла приводит к нарушению свойства упорядоченности, то есть тогда, когда увеличенный вес узла стал больше, чем вес следующего по порядку узла. Если и дальше продолжать обрабатывать увеличение веса, двигаясь к корню дерева, то наше дерево перестанет быть деревом Хаффмана.

Чтобы сохранить упорядоченность дерева кодирования, алгоритм работает следующим образом. Пусть новый увеличенный вес узла равен W+1. Тогда начинаем двигаться по списку в сторону увеличения веса, пока не найдем последний узел с весом W. Переставим текущий и найденный узлы между собой в списке, восстанавливая таким образом порядок в дереве. (При этом родители каждого из узлов тоже изменятся.) На этом операция перестановки заканчивается.

После перестановки операция увеличения веса узлов продолжается дальше. Следующий узел, вес которого будет увеличен алгоритмом, — это новый родитель узла, увеличение веса которого вызвало перестановку.
[править]
Переполнение

В процессе работы алгоритма сжатия вес узлов в дереве кодирования Хаффмана неуклонно растет. Первая проблема возникает тогда, когда вес корня дерева начинает превосходить вместимость ячейки, в которой он хранится. Как правило, это 16-битовое значение и, следовательно, не может быть больше, чем 65535. Вторая проблема, заслуживающая ещё большего внимания, может возникнуть значительно раньше, когда размер самого длинного кода Хаффмана превосходит вместимость ячейки, которая используется для того, чтобы передать его в выходной поток. Декодеру все равно, какой длины код он декодирует, поскольку он движется сверху вниз по дереву кодирования, выбирая из входного потока по одному биту. Кодер же должен начинать от листа дерева и двигаться вверх к корню, собирая биты, которые нужно передать. Обычно это происходит с переменной типа «целое», и, когда длина кода Хаффмана превосходит размер типа «целое» в битах, наступает переполнение.

Можно доказать, что максимальную длину код Хаффмана для сообщений с одним и тем же входным алфавитом будет иметь, если частоты символов образует последовательность Фибоначчи. Сообщение с частотами символов, равными числам Фибоначчи до Fib (18), — это отличный способ протестировать работу программы сжатия по Хаффману.
[править]
Масштабирование весов узлов дерева Хаффмана

Принимая во внимание сказанное выше, алгоритм обновления дерева Хаффмана должен быть изменен следующим образом: при увеличении веса нужно проверять его на достижение допустимого максимума. Если мы достигли максимума, то необходимо «масштабировать» вес, обычно разделив вес листьев на целое число, например, 2, а потом пересчитав вес всех остальных узлов.

Однако при делении веса пополам возникает проблема, связанная с тем, что после выполнения этой операции дерево может изменить свою форму. Объясняется это тем, что мы делим целые числа и при делении отбрасываем дробную часть.

Правильно организованное дерево Хаффмана после масштабирования может иметь форму, значительно отличающуюся от исходной. Это происходит потому, что масштабирование приводит к потере точности нашей статистики. Но со сбором новой статистики последствия этих «ошибок» практически сходят на нет. Масштабирование веса — довольно дорогостоящая операция, так как она приводит к необходимости заново строить все дерево кодирования. Но, так как необходимость в ней возникает относительно редко, то с этим можно смириться.

Выигрыш от масштабирования

Масштабирование веса узлов дерева через определенные интервалы дает неожиданный результат. Несмотря на то, что при масштабировании происходит потеря точности статистики, тесты показывают, что оно приводит к лучшим показателям сжатия, чем если бы масштабирование откладывалось. Это можно объяснить тем, что текущие символы сжимаемого потока больше «похожи» на своих близких предшественников, чем на тех, которые встречались намного раньше. Масштабирование приводит к уменьшению влияния «давних» символов на статистику и к увеличению влияния на неё «недавних» символов. Это очень сложно измерить количественно, но, в принципе, масштабирование оказывает положительное влияние на степень сжатия информации. Эксперименты с масштабированием в различных точках процесса сжатия показывают, что степень сжатия сильно зависит от момента масштабирования веса, но не существует правила выбора оптимального момента масштабирования для программы, ориентированной на сжатие любых типов информации.
[править]
Применение

Сжатие данных по Хаффману применяется при сжатии фото- и видеоизображений (JPEG, стандарты сжатия MPEG), в архиваторах (PKZIP, LZH и др.), в протоколах передачи данных MNP5 и MNP7.
[править]

Добавлено через 50 секунд
это но я там не видел не одного символа из языка !
или вы какимто другим пользуетесь ?
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
13.11.2010, 22:57     Метод сжатия Хаффмана #8
Не обижайтесь, но я в ваших сообщениях не вижу "ни одного символа из языка". Из русского языка. Вернее символы вижу, смысла не вижу. Выражайтесь яснее.
*В*Е*Л*И*К*А*Н*
Заблокирован
15.11.2010, 20:54  [ТС]     Метод сжатия Хаффмана #9
так как он действует чо молчите странный у вас форум ?
MikeSoft
Эксперт С++
3792 / 1774 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
15.11.2010, 23:50     Метод сжатия Хаффмана #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
*В*Е*Л*И*К*А*Н*, странный форум? Или же у вас странные вопросы?
Если вы не хотите понимать то, что вам пишут - вам здесь не место.
Получите свою заслуженную карточку.

Вам люди дали чёткое описание алгоритма. Нужно было всего лишь почитать и написать программу.
Так вам же было лень потратить пару драгоценных часов.
Люди должны всё за вас сделать? Не дождётесь.
*В*Е*Л*И*К*А*Н*
Заблокирован
21.11.2010, 21:03  [ТС]     Метод сжатия Хаффмана #11
я понимаю всё только просто все высказывают упрёки и не оди человек по теме не пишит это жуть и тупо !
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2010, 21:39     Метод сжатия Хаффмана
Еще ссылки по теме:

результат сжатия изображения2 - C++
Черно-белое квадратное изображение размером 8 x 8 задано матрицей цветов отдельных пикселов. Придумать более компактный способ хранения для...

Алгоритм сжатия аудио ! - C++
Нужна реализация алгоритма Райса для сжатия аудио файлов на С++ (наличие коментов приветствуется). Надо до конца недели разобраться в...

Алгоритм сжатия данных - C++
подскажите алгоритм сжатия данных, чтобы был не очень сложный и в то же время эффективный

Алгоритм сжатия PPM-D - C++
Может кто рассказать о алгоритме сжатия PPM-D и как его реализовать или покидайте ссылки, литературу какую то (Гугл не предлагать, искал,...

результат сжатия изображения. - C++
Черно-белое квадратное изображение размером 10 x 10 задано матрицей цветов отдельных пикселов. Придумать более компактный способ хранения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
21.11.2010, 21:39     Метод сжатия Хаффмана #12
*В*Е*Л*И*К*А*Н*, в Вашем случае есть два варианта решения:
1. Вы включаете мозг, покупаете учебник русского языка и начинаете задавать конкретные вопросы с соблюдением правил грамматики и орфографии.
2. Вы заканчиваете Ваши бесплодные попытки освоения программирования, а заодно и заканчиваете донимать форумчан бессмысленными вопросами.

Тема закрыта в связи с бессмысленностью.
Yandex
Объявления
21.11.2010, 21:39     Метод сжатия Хаффмана
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru