В RFC-1951 есть простой алгоритм, восстанавливающий дерево Хаффмана из списка длин кодов, описанный следующим образом:
1) Count the number of codes for each code length. Let
bl_count[N] be the number of codes of length N, N >= 1.
2) Find the numerical value of the smallest code for each
code length:
code = 0;
bl_count[0] = 0;
for (bits = 1; bits <= MAX_BITS; bits++) {
code = (code + bl_count[bits-1]) << 1;
next_code[bits] = code;
}
3) Assign numerical values to all codes, using consecutive
values for all codes of the same length with the base
values determined at step 2. Codes that are never used
(which have a bit length of zero) must not be assigned a
value.
for (n = 0; n <= max_code; n++) {
len = tree[n].Len;
if (len != 0) {
tree[n].Code = next_code[len];
next_code[len]++;
}
Но никаких проверок согласованности данных в алгоритме нет. С другой стороны, очевидно, что список длин может быть недействительным. Значения длины из-за кодирования в 4 бита не могут быть недействительными, но, например, кодов может быть больше, чем может быть закодировано для некоторой длины кода.
Какой минимальный набор проверок обеспечит валидацию данных? Или такие проверки не нужны по какой-то причине, которую я пропустил?