[devel] вопрос про числа
Vladislav Zavjalov
slazav at altlinux.org
Sun Nov 8 20:45:38 UTC 2009
On Sat, Nov 07, 2009 at 10:34:02PM +0300, Alexey Tourbin wrote:
> Сгенирируем n случайных чисел из диапазона 0..2^m-1 и упорядочим их
> по возрастанию. Для примера m=32, n порядка 10^3.
>
> Вычислить энтропию и предложить оптимальную процедуру кодирования
> (сжатия) последовательности. Сколько битов на число можно получить?
А вот еще одна идея, наоборот, для малых n.
Если у нас два числа, можно использовать 2m-1 бита для их хранения,
выиграть один бит, так как порядок чисел не важен.
Достигается это легко: если считать все по модулю 2^m, то у нас есть два
числа и два непрерывных диапазона остальных чисел.
Один из этих диапазонов меньше чем (2^m)/2.
То число, перед которым пустой диапазон больше, запишем явно, m битами.
Кроме того, запишем расстояние от него до второго числа, m-1 битами.
Если чисел n, будем действовать похоже: Выберем максимальное расстояние
между соседними числами (оно больше чем (m^2)/n). Запишем число, стоящее
после этого максимального пустого диапазона.
Оставшихся вне максимального диапазона чисел меньше чем (2^m)(1-1/n).
Повторим для них ту же процедуру, считая числа от начала этого нового
диапазона по модулю (2^n)(1-1/n).
Получим последовательную запись всех наших n чисел, причем ограничения
на их размер будут такими:
(2^m)
(2^m)(1 - 1/n)
(2^m)(1 - 1/n)(1 - 1/(n-1))
...
(2^m)(1 - 1/n)(1 - 1/(n-1)) ... ( 1 - 1/2)
Если я не ошибаюсь, энтропия такого набора:
m*n + \sum_{i=1}^{n-1} [ (n-i) \log (1 - 1/(n-i+1)) ]
Для n=1000 и m=32 это 30.6 бит на число...
Слава
More information about the Devel
mailing list