Грубая сила не правильный способ сделать это. Это одна из тех проблем, когда, если вы знаете что-то определенное, это не так сложно, но если вы никогда не слышали об этом, это практически невозможно. Это 1001 * деревья Хаффмана .
[Редактировать] При дальнейшем рассмотрении кажется, что вы не можете построить дерево Хаффмана на N узлах с определенными частотами, потому что функция стоимости для строки равна 4 * (# of 1) + (# of 0) , Если бы функцией стоимости была длина строки (или ее кратное число), вы могли бы создать дерево Хаффмана.
Любой кодовый набор без префиксов может быть представлен в виде бинарного дерева, подобного Хаффману, где каждый узел имеет 0 или 2 дочерних узла, а конечные узлы представляют коды. Учитывая дерево с N узлами, мы можем построить дерево с N + 1 узлами следующим образом:
- Выберите листовой узел с наименьшей стоимостью, где стоимость листового узла составляет 4 * (количество единиц на пути от корня к листу) + (число нулей на пути)
- Добавить 2 детей в этот узел
Таким образом, если код узла был ранее xxxx, то мы удаляем этот код из нашего кодового набора (поскольку он больше не является листом) и добавляем два кода xxxx0 и xxxx1. Общая стоимость кодового набора теперь увеличилась на
`стоимость (xxxx0) + стоимость (xxxx1) - стоимость (xxxx) = стоимость (0) + стоимость (1) + стоимость (xxxx) = 5 + стоимость (xxxx)
Следовательно, mincost (N + 1) <= mincost (N) + 5 + стоимость (самый дешевый код в лучшем решении для N). Моя теория заключается в том, что это неравенство должно быть равенством, но я пока не смог доказать это. Для всех значений, которые вы перечислили и которые вы использовали для подбора, это утверждение фактически является равенством. </p>
Если это равенство, то для решения проблемы вы должны сделать следующее:
- Начните с пустого набора кодов, общая стоимость которого равна нулю
- Итерируя от 1 до 10 9 , выполните:
- Найдите самый дешевый код в вашем наборе кодов
- Разделите этот код на два, добавив 0 и 1
- Добавьте стоимость этого кода + 5 к общей стоимости
Если вы используете приоритетную очередь , вы сможете сделать это за O (N log N). Это может или не может быть осуществимо, учитывая верхний предел 10 9 .