Чтобы сократить длинную историю, я пытаюсь создать коды Хаффмана из канонического списка Хаффмана. По существу, должны выполняться следующие две петли и генерировать двоичную строку. Код: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
После возвращения через мой код, кажется, что я на самом деле делает небольшую ошибку при чтении данных, в первую очередь, поэтому я получаю неверные коды Хаффмана !!
Вы обновляете коды, когда идете. Нормально, что коды хаффмана изменяются в зависимости от значений, которые вы уже видели. Другая проблема, с которой вы сталкиваетесь, заключается в том, что нет способа узнать, где останавливаются ваши значения, например. is '1011000' 4144111 или 581 –
Я не совсем уверен, что вы имеете в виду Питер? Должен признаться, я все еще немного смущен кодами Хаффмана. Не могли бы вы уточнить? – Tony
Я предполагаю, что вы генерируете свои коды хаффмана заранее, или ваш вопрос не имеет смысла. Обычно вы обновляете код huffman при обработке каждого символа. Это означает, что код, который означает один символ, может означать другой символ позже. –