Im, пытаясь сжать последовательность неотрицательных чисел, где:Как сжимать последовательность бит N бит повторного номера?
- Диапазон значений каждого числа от 0 до 2^N-1
Каждое число появляется только один раз (это означает, что это всего 2^N чисел)
Пример для N = 4:
[14, 1, 8, 2, 12, 6, 0, 10, 4, 13, 5, 7, 15, 9, 3, 11]
Так обычно каждый номер будет стоить 4 бита, а для 16 номеров нам потребуется использовать 16x4 = 64 бит для их хранения.
В настоящее время я просто подумал, сжимая их, как показано ниже:
- За первые 8 номеров -> Использование 4 бит для хранения каждого из них.
- В течение следующих 4 цифры ---> только 3 бит/каждый
- В течение следующих 2 номера ---> только 2 бита/каждый
- В течение следующих 1 чисел ---> только 1 бит для Это.
- Для последнего, на самом деле его не necesssary хранить (Очевидно, что мы должны знать, что последний номер, если мы знаем, все остальные 15 номеров)
Так сжатый размер данных будет:
Z = 8 * 4 + 4 * 3 + 2 * 2 + 1 * 1 + 1 * 0 = 49 bits
Коэффициент сжатия составляет около 76%, что довольно хорошо (я думаю).
Но при больших значениях N, отношение, кажется, уменьшается (при N = 2048, отношение только 91%)
Так что я хотел бы услышать ваши предложения для лучшего сжатия.
спасибо.
Как вы отметили свой вопрос [tag: C++], не могли бы вы показать небольшой образец вашего подхода к внедрению? Это может иметь значение для худших коэффициентов сжатия. –
Сохраняет ли исходный порядок? – jdphenix
@jdphenix: да, это очень важно. – UenX