Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2015, 17:24   #1
Valtasaar
 
Аватар для Valtasaar
 
Регистрация: 27.11.2015
Сообщений: 9
По умолчанию Сжатие файла методом Хаффмана на PHP

Доброго всем!

По вопросу нашел много примеров на Си и JAVA, но мне это не помогло. Пытаюсь самостоятельно что-то выдумать.

Вот начальный код:
PHP код:
$handle fopen($fileComUpName'r+');
        
        
//Цикл для создания массива символов
        
$arrChar = array();
        
$i 0;
        if (
$handle) {
            while (
false !== ($char fgetc($handle))){
                
$arrChar[$i] =  $char;
                
$i++;                
            }
        }
 
        
//Количество повторений символов и сортировка по возрастанию
        
$arrCharVal array_count_values ($arrChar);
        
asort($arrCharVal);
 
        
//Дерево
        
$arrTree = array();
 
        while (
count($arrCharVal) > 1) {
            
$key1 key($arrCharVal);
            
$val1 array_shift($arrCharVal);
            
$key2 key($arrCharVal);
            
$val2 array_shift($arrCharVal);
 
            
$key $key1.$key2;
            
$val $val1 $val2;
 
            
$arrTree[$key] = $val;
 
            
$arrCharVal[$key] = $val;
            
asort($arrCharVal);
        }
        
asort($arrTree); 
После таких манипуляций я получил массив с элементами, у которых ключи это символы, а значения - общее число повторений.

Как быть дальше? Насколько я понял метод Хаффмана предполагает сжатие данных за счет уменьшения количества бит, которыми закодированы символы. А если узлов в дереве получилось более 300, то и на один символ будет приходиться соответствующее количество битов. В общем дальше мне непонятно.
Valtasaar вне форума Ответить с цитированием
Старый 27.11.2015, 21:58   #2
was3110
Форумчанин
 
Аватар для was3110
 
Регистрация: 25.04.2010
Сообщений: 254
По умолчанию

т.е. Вы получили частоты символов. Первый шаг сделан правильно. Осталось построить дерево и таблицу Хаффмана. Т.к. кодирование производится по таблице, а декодирование по дереву. Примеры нашли - это хорошо, а смысл метода (теоретически) не уяснили - плохо.
О смысле здесь...
помогать студентам - моя вторая профессия
was3110 вне форума Ответить с цитированием
Старый 28.11.2015, 13:34   #3
Valtasaar
 
Аватар для Valtasaar
 
Регистрация: 27.11.2015
Сообщений: 9
По умолчанию

was3110, спасибо за ответ.
В последнем своем действии в коде я и попытался построить дерево. Складывал два символа с наименьшим повторением и записывал значение в массив. Суммируемые символы записывал как ключ, а вхождения как значение.

Структура полученного массива:
Символ1Символ2 => Сумма повторений,
Символ1Символ2Символ3 => Сумма повторений,
и т. д.

Далее, насколько я понял, нужно пройтись по этому массиву от элемента с самой высокой общей суммой вхождений до первого по упорядоченному порядку, параллельно присваивая символам либо 0 либо 1. Если я это сделаю в полученном массиве то множество символов будут закодированы кодом длинной более 8 бит. Это вообще возможно? Либо я неправильно построил дерево, либо не понял правило прохода по нему.
Valtasaar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сжатие jpeg. Стандартные таблицы Хаффмана. stragger Общие вопросы C/C++ 4 13.05.2013 16:17
Кодирование Модифицированным методом Хаффмана diallfam Visual C++ 1 28.01.2013 08:56
Архиватор методом Хаффмана на Delphi Natka.Elka Помощь студентам 5 07.12.2011 20:05
Реализация кодирования методом Хаффмана на Pascal Azarat Помощь студентам 3 06.12.2010 09:34
Сжатие информации методом Хаффмана на С++ BaSoff Общие вопросы C/C++ 3 18.11.2009 19:51