2013-05-12 1 views
4

Чтобы сократить длинную историю, я пытаюсь создать коды Хаффмана из канонического списка Хаффмана. По существу, должны выполняться следующие две петли и генерировать двоичную строку. Код:Java loop and shifting

for (int i = 1; i <= 17; i++) { 
     for (int j = 0; j < input.length; j++) { 
      if (input[j] == i) { 
       result.put(allocateCode(i, j), j); //update a hashmap 
       huffCode += (1 << (17 - i)); //Update the huffman code 
      } 
     } 

    } 

По существу, код должен выглядеть для всех кодов с длиной 1 и генерировать код Хаффмана для каждого. Так, например, длины 1 должны идти (по порядку): 0, 1. И длины три будут идти 100, 101, 110.

Функция allocateCode просто возвращает строку, которая показывает результат, первый запуск производит это:

Huffman code for code 2 is: 0 (0) length was: 1 
Huffman code for code 6 is: 10 (2) length was: 2 
Huffman code for code 0 is: 1100 (12) length was: 4 
Huffman code for code 3 is: 1101 (13) length was: 4 
Huffman code for code 4 is: 1110 (14) length was: 4 
Huffman code for code 7 is: 11110 (30) length was: 5 
Huffman code for code 1 is: 111110 (62) length was: 6 
Huffman code for code 5 is: 111111 (63) length was: 6 

Это правильно, и были созданы правильные коды Хаффмана. Тем не менее, запустив его на второй массив длин производит это:

Huffman code for code 1 is: 0 (0) length was: 1 
Huffman code for code 4 is: 1 (1) length was: 1 
Huffman code for code 8 is: 100 (4) length was: 3 
Huffman code for code 9 is: 100 (4) length was: 3 
Huffman code for code 13 is: 101 (5) length was: 3 
Huffman code for code 16 is: 1011000 (88) length was: 7 
Huffman code for code 10 is: 10110001 (177) length was: 8 
Huffman code for code 2 is: 101100011 (355) length was: 9 
Huffman code for code 3 is: 101100011 (355) length was: 9 
Huffman code for code 0 is: 1011001000 (712) length was: 10 
Huffman code for code 5 is: 1011001000 (712) length was: 10 
Huffman code for code 6 is: 1011001001 (713) length was: 10 
Huffman code for code 7 is: 10110010011 (1427) length was: 11 
Huffman code for code 14 is: 10110010011 (1427) length was: 11 
Huffman code for code 17 is: 10110010100 (1428) length was: 11 
Huffman code for code 19 is: 10110010100 (1428) length was: 11 
Huffman code for code 18 is: 101100101010000 (22864) length was: 15 

Как вы можете видеть, тот же код генерируется несколько раз, примеры кода 8 & 9, и коды 2 & 3.

Я думаю, что моя проблема кроется в вложенных циклах, однако я не могу понять, почему она отлично работает для одного прогона и не работает на другом.

Возможно, мне просто не хватает чего-то очевидного, но я не вижу его для поиска.

Любые советы были бы весьма полезными.

Благодаря

UPDATE

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

+0

Вы обновляете коды, когда идете. Нормально, что коды хаффмана изменяются в зависимости от значений, которые вы уже видели. Другая проблема, с которой вы сталкиваетесь, заключается в том, что нет способа узнать, где останавливаются ваши значения, например. is '1011000' 4144111 или 581 –

+0

Я не совсем уверен, что вы имеете в виду Питер? Должен признаться, я все еще немного смущен кодами Хаффмана. Не могли бы вы уточнить? – Tony

+0

Я предполагаю, что вы генерируете свои коды хаффмана заранее, или ваш вопрос не имеет смысла. Обычно вы обновляете код huffman при обработке каждого символа. Это означает, что код, который означает один символ, может означать другой символ позже. –

ответ

1

Первые два кода в вашем втором примере имеют длину одну, которая не оставляет других возможных кодов после этих первых двух. Все шаблоны префикса были израсходованы.

Ваш код должен содержать количество доступных оставшихся кодов для обнаружения ошибочного ввода. Просто уменьшите счетчик для каждого кода и удвоьте количество отсчетов каждый раз, когда вы переходите на следующую длину больше текущей. (Удостоверьтесь, что вы удвоились, даже если таких кодов нет, например, если вы переходите из кодов длины 3 в коды длиной 5, удвойте число для кодов длиной 4, даже если их нет.) Запустите счет в два раза для длины одного кода.

Если этот счет когда-либо отрицательный, у вас есть ошибка, и вы можете остановиться прямо там. Невозможно назначить коды этому набору длин.

Если в конце процесса счетчик не равен нулю, значит, у вас есть неполный код. Это может быть или не быть ошибкой в ​​зависимости от вашего приложения. Это означает, что код не является оптимальным, и для кодирования этих символов могло использоваться меньшее количество бит.

 Смежные вопросы

  • Нет связанных вопросов^_^