Да, это просто способ построить код Хаффмана с ограничением на длину кодового слова.
Код Хаффмана кодирует каждую букву алфавита двоичной строкой, которую можно однозначно определить. Например, если ваш алфавит {A, B, C} и A встречается чаще, чем B и C, следующая кодировка может работать хорошо:
A - 0
B - 10
C - 11
Закодированная строка, такая как 0010110, может быть закодирована уникальным образом, потому что длина кодирующей битовой строки уже определена кодом Хаффмана (здесь --- каждая строка, начинающаяся с 0, имеет длину 1, а каждая строка, начинающаяся с 1, имеет длину 2). Таким образом, строка декодируется как 0|0|10|11|0 = AABCA.
Теперь «проблема» при построении кодов Хаффмана состоит в том, как выбрать битовые строки кодирования так, чтобы результирующие кодировки были в среднем как можно короче. В вашей задаче есть дополнительное ограничение, что длина любого кодового слова не может превышать L. Общая идея состоит в том, чтобы использовать более короткие строки для кодирования более распространенных символов.
Детали алгоритма слияния пакетов не важны, так как ключ в том, что вы используете алгоритм для выбора «набора монет минимальной нумизматической стоимости, номиналы которых в сумме составляют n - 1». Если у вас есть монеты достоинством 2-1, 2-2, ..., и вы хотите построить из них общую стоимость 100 центов, вы можете подумать о этот процесс состоит в том, чтобы сначала получить монету номиналом 100, а затем разделить ее на два 50 цента (2−1), а затем продолжить делить ваши монеты пополам столько, сколько вы хотите, например 50 центов + 25 центов + 12,5 центов + 12,5 центов. Это соответствует построению бинарного дерева; всякий раз, когда вы разделяете монету, вы создаете внутренний узел в двоичном дереве и добавляете два листа на один уровень глубже.
Теперь идея минимизации нумизматической ценности заключается в том, что те «монеты», которые связаны с «более частотными» символами, дороже в использовании, поэтому вы хотите меньше разбивать эти монеты, соответствующие более коротким кодам.
Детали оставлены читателю в качестве упражнения.
person
Antti Huima
schedule
25.04.2011