![]() |
| | |||||||
| Регистрация | Правила | Блоги | Пользователи | Социальные группы | Поиск | Сообщения за день | Все разделы прочитаны |
| |
![]() |
| |
| | #1 | |
|
Гость
Гость
Сообщений: n/a |
Народ, нужна помощь в поиске кода реализующего алгоритм кодирования и декодирования сообщения методом Шеннона-Фано на Си. Заранее благодарен.
| |
| Другие темы раздела | |
| C++ Программирование контроллеров Подскажите, плз, где можно найти инфу по программированию контроллеров (напр. СИМАТЕКов, ФЕКов) с использованием с,с++?. Программирование контроллеров | Помогите разобраться с printf, пожалуйста. C++ Привет! Пришел на форум за помощью. Я начал изучать язык программирования С. И столкнулся с проблемой. Не получается вывести текст на экран так, как я хочу. Пишу в программе следующую строку: printf("\n\n%45s %s %s","text","%s","text",name); , а на экране второй заполнитель не печатается,.... Помогите разобраться с printf, пожалуйста. |
| | #2 | |
|
WADDICK
Гость
Сообщений: n/a |
Кодирование Шеннона-Фано является одним из самых первых алгоритмов сжатия, который впервые сформулировали американские учёные Шеннон (Shannon) и Фано (Fano). Данный метод сжатия имеет большое сходство с кодированием Хаффмана, которое появилось на несколько лет позже. Главная идея этого метода - заменить часто встречающиеся символы более короткими кодами, а редко встречающиеся последовательности более длинными кодами. Таким образом, алгоритм основывается на кодах переменной длины. Для того, чобы декомпрессор впоследствии смог раскодировать сжатую последовательность, коды Шеннона-Фано должны обладать уникальностью, то есть, не смотря на их переменную длину, каждый код уникально определяет один закодированый символ и не является префиксом любого другого кода. Рассмотрим алгоритм вычисления кодов Шеннона-Фано (для наглядности возьмём в качестве примера последовательность 'aa bbb cccc ddddd'). Для вычисления кодов, необходимо создать таблицу уникальных символов сообщения c(i) и их вероятностей p(c(i)), и отсортировать её в порядке невозрастания вероятности символов. c(i) p(c(i)) d 5 / 17 c 4 / 17 space 3 / 17 b 3 / 17 a 2 / 17 Далее, таблица символов делится на две группы таким образом, чтобы каждая из групп имела приблизительно одинаковую частоту по сумме символов. Первой группе устанавливается начало кода в '0', второй в '1'. Для вычисления следующих бит кодов символов, данная процедура повторяется рекурсивно для каждой группы, в которой больше одного символа. Таким образом для нашего случая получаем следующие коды символов: символ код d 00 c 01 space 10 b 110 a 111 Длина кода s(i) в полученной таблице равна int(-lg p(c(i))), если сиволы удалость разделить на группы с одинаковой частотой, в противном случае, длина кода равна int(-lg p(c(i))) + 1. int(-lg p(c(i))) <= s(i) <= int(-lg p(c(i))) + 1 Успользуя полученную таблицу кодов, кодируем входной поток - заменяем каждый символ соответствующим кодом. Естественно для расжатия полученной последовательности, данную таблицу необходимо сохранять вместе со сжатым потоком, что является одним из недостатков данного метода. В сжатом виде, наша последовательность принимает вид: 111111101101101101001010101100000000000 длиной в 39 бит. Учитывая, что оргинал имел длину равную 136 бит, получаем коэффициент сжатия ~28% - не так уж и плохо. Глядя на полученную последовательность, возникает вопрос: "А как же теперь это расжать ?". Мы не можем, как в случае кодирования, заменять каждые 8 бит входного потока, кодом переменной длины. При расжатии нам необходимо всё сделать наоборот - заменить код переменной длины символом длиной 8 бит. В данном случае, лучше всего будет использовать бинарное дерево, листьями которого будут являтся символы (аналог дерева Хаффмана). Кодирование Шеннона-Фано является достаточно старым методом сжатия , и на сегодняшний день оно не представляет особого практического интереса (разве что как упражнение по курсу структур данных). В большинстве случаев, длина сжатой последовательности, по данному методу, равна длине сжатой последовательности с использованием кодирования Хаффмана. Но на некоторых последовательностях всё же формируются не оптимальные коды Шеннона-Фано, поэтому сжатие методом Хаффмана принято считать более эффективным. Для примера, рассмотрим последовательность с таким содержанием символов: 'a' - 14, 'b' - 7, 'c' - 5, 'd' - 5, 'e' - 4. Метод Хаффмана сжимает её до 77 бит, а вот Шеннона-Фано до 79 бит. символ код Хаффмана код Шеннона-Фано a 0 00 b 111 01 c 101 10 d 110 110 e 100 111 Кстати, в одном источнике (не буду указывать каком), эту последовательность сжали методом Шеннона-Фано до 84 бит, а методом Хаффмана до тех же 77. Такие отличаи в степени сжатия возникают из-за нестрогого определения способа деления символов на группы. Как же мы делили на группы ? Достаточно просто: 1. вероятноть первой группы (p1) и второй (p2) равна нулю; 2. p1 <= p2 ? * да: добавить в первую группу символ с начала таблицы; * нет: добавить во вторую группу символ с конца таблицы; 3. если все символы разделены на группы, то завершить алгоритм, иначе перейти к шагу 2. Из-за такой неопределённости у некоторых людей возникают даже такие мысли: "... программа иногда назначает некоторым символам ..." и так далее - рассуждения о длине кодов. Если вы не пишете AI, то такое понятие, как "программа иногда" что-то делает, звучит смешно. Правильно реализованный алгоритм - работает строго опеределённо. | |
| | #3 | |
|
banderos_a
Гость
Сообщений: n/a |
Попробуй помскать на сервере Корбины. Там что-то вроде я такое встречал. Довольно таки полный учебник по этому методу.
| |
| | #4 | |
|
Warrusha
Гость
Сообщений: n/a | http://www.algolist.ncstu.ru/compres...annon_fano.php это тоже достаточно полное и понятное описание метода | |
| | #5 | |
| *.f90 Новичок Регистрация: 23.01.2012
Сообщений: 13 Репутация: 0 (0) | | |
| | ||
| | #6 | |
| talis Форумчанин Регистрация: 11.05.2010 Адрес: talis_t * ptr = &talis;
Сообщений: 1,186 Репутация: 675 (482) | | |
| | ||
| После регистрации реклама в сообщениях будет скрыта | |
| | #7 | |
| *.f90 Новичок Регистрация: 23.01.2012
Сообщений: 13 Репутация: 0 (0) | не совсем понял... т.е. 1. вероятноть первой группы (p1) и второй (p2) равна нулю; 2. p1 <= p2 ? * да: p1=p1+p(с начала таблицы) + символ с начала таблицы * нет: p2=p2+p(с конца таблицы) + символ с конца таблицы 3. пункт говорит, что делается всё в цикле чтоб просмотреть все p и занести символы в 2 таблицы, так ? | |
| | ||
![]() |
| Похожие темы | |
| Тема | Автор |
| C# для начинающих Реализация алгоритма сжатия данных методом Шеннона-Фано Предполагается разработать программу сжимающая текстовый файл (*.txt) методом Шеннона-Фано, которая позволит: 1)подключить текстовый файл к программе; 2)создавать упакованный файл и осуществлять распаковку - обратно в файл; 3)создавать вспомогательные таблицу(-ы), поясняющие процесс формирования... | Mantis1991 |
| C# для начинающих Реализация алгоритма сжатия данных методом Шеннона-Фано Предполагается разработать программу сжимающая текстовый файл (*.txt) методом Шеннона-Фано, которая позволит: 1)подключить текстовый файл к программе; 2)создавать упакованный файл и осуществлять распаковку - обратно в файл; 3)создавать вспомогательные таблицу(-ы), поясняющие процесс формирования... | Mantis1991 |
| Delphi Алгоритм сжатия Шеннона - Фано Здравствуйте, мне нужна помощь. Пишу программу Алгоритм сжатия Шеннона - Фано на Delphi. Нужен маленький алгоритм построения кода по вероятностям. Имеется StringGrid1 со списком вероятностей для каждого знака и нужно заполнить код Code(X) по примеру: p(X)=всего 15 букв |Code(X)... | Gorezcaid |
| Delphi для начинающих сортировка методом шеннона фано и хаффмана! что означают данные комманды? var i,j,x:Integer; begin SetLength(FCodeIndex,FCodesPerTable); for i:=0 to FCodesPerTable-1 do FcodeIndex:=i; for i:=0 to FCodesPerTable-1 do for j:=i+1 to FCodesPerTable-1 do If FCodeTable].CodeBits>=FcodeTable].CodeBits then begin X:=FCodeIndex; | pioneer71 |
| Pascal (Паскаль) архивация методом Шеннона-Фано Поделитесь, пожалуйста, исходником на паскале архивация методом Шеннона-Фано. | Гость34 |
| Опции темы | |
| |
| |