PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (2): « 1 [2]

> Найдено сообщений: 17
Valtasaar Отправлено: 28 Ноября, 2015 - 16:18:47 • Тема: Сжатие файла методом Хаффмана • Форум: Вопросы новичков

Ответов: 11
Просмотров: 704
DeepVarvar
это я все понимаю. Как это все правильно реализовать на php?
Valtasaar Отправлено: 28 Ноября, 2015 - 14:31:46 • Тема: Сжатие файла методом Хаффмана • Форум: Вопросы новичков

Ответов: 11
Просмотров: 704
Доброго всем!

Есть желание понять алгоритм Хаффмана для сжатия данных.

Начальный код:
PHP:
скопировать код в буфер обмена
  1. $handle = fopen($fileComUpName, 'r+');
  2.          
  3.         //Цикл для создания массива символов
  4.         $arrChar = array();
  5.         $i = 0;
  6.         if ($handle) {
  7.             while (false !== ($char = fgetc($handle))){
  8.                 $arrChar[$i] =  $char;
  9.                 $i++;                
  10.             }
  11.         }
  12.  
  13.         //Количество повторений символов и сортировка по возрастанию
  14.         $arrCharVal = array_count_values ($arrChar);
  15.         asort($arrCharVal);
  16.  
  17.         //Дерево
  18.         $arrTree = array();
  19.  
  20.         while (count($arrCharVal) > 1) {
  21.             $key1 = key($arrCharVal);
  22.             $val1 = array_shift($arrCharVal);
  23.             $key2 = key($arrCharVal);
  24.             $val2 = array_shift($arrCharVal);
  25.  
  26.             $key = $key1.$key2;
  27.             $val = $val1 + $val2;
  28.  
  29.             $arrTree[$key] = $val;
  30.  
  31.             $arrCharVal[$key] = $val;
  32.             asort($arrCharVal);
  33.         }
  34.         asort($arrTree);  


Сначала я считал символы с файла и поместил их в массив.
Затем подсчитал количество вхождений каждого символа и упорядочил по возрастанию.
Далее попытался построить дерево. Складывал элементы символов с наименьшим вхождением. Результат записывал в массив, где в качестве ключа используются символы, а в качестве значения сумма вхождений. В итоге получился массив вида:
Array (
[char1char2]=>value,
[char1char2char3]=>value,
...................... и т. д.
) Здесь char - это символы, value - общее число вхождений.

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

Страниц (2): « 1 [2]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB