Эти коды «старт-шаг-стоп» похожи на другой способ вызова кодов Хаффмана . См. базовую технику для описания псевдокода для их вычисления.
По сути, это то, что делает алгоритм:
Прежде чем начать кодирование Хаффмана, вам нужно собрать статистику по каждому символу, который вы будете сжимать (их общая частота в файле для сжатия).
После того, как вы создадите двоичное дерево , используя эту информацию, чтобы наиболее часто используемые символы находились в верхней части дерева (и, следовательно, использовали меньше битов) и чтобы в кодировке не было 1013 * код префикса . Поскольку, если кодировка имеет общий префикс, возможна декомпрессия неоднозначностей.
В конце кодировки Хаффмана начальное значение будет равно глубине самого мелкого конечного узла, ваш шаг всегда будет равен 1 (логически это имеет смысл, зачем вам устанавливать больше битов, чем нужно, просто добавляйте по одному за раз ,) и вашим стоп-значением будет глубина самого глубокого конечного узла.
Если частотные характеристики не отсортированы, потребуется O (nlog n), если они отсортированы по частоте, это можно сделать за O (n).
Коды Хаффмана гарантированно имеют наилучшее среднее сжатие для этого типа кодирования:
Хаффман смог спроектировать максимально
эффективный метод сжатия этого
тип: нет другого отображения личности
исходные символы для уникальных строк
биты будут производить меньше среднего
выходной размер, когда фактический символ
Частоты согласуются с теми, которые используются для
создайте код.
Это должно помочь вам найти идеальное решение вашей проблемы.
Редактировать: Хотя, похоже, это не то, что искал ОП.
Эта академическая статья создателя этих кодов описывает обобщение кодов старт-шаг-стоп, кодов старт-стоп. Тем не менее, автор кратко описывает, как получить оптимальный старт-шаг-стоп ближе к концу раздела 2. Он включает в себя использование статистической случайной величины или грубую силу, финансирующую лучшую комбинацию. Без каких-либо предварительных знаний о файле алгоритм O ((log n) ^ 3).
Надеюсь, это поможет.