我有很多唯一的数字,全为正,顺序无关紧要0 < num < 2^32
。
例:23 56 24 26
最大的56
需要6 bits
空间。所以,我需要:4*6 = 24 bits
总计。
为了节省空间,我执行以下操作:
首先对它们进行排序:(23 24 26 56
因为顺序无关紧要)
现在,我得到了与上一个的不同之处:23 1 2 30
最大的30
需要5 bits
空间。
之后,我将所有数字存储在4*5 bits = 20 bits
空间中。
问题:如何进一步改进该算法?
详细信息:自要求以来,数字大多在的范围内2.000-4.000
。少于的数字300
非常罕见。数量16.000
也非常罕见。一般来说,所有数字都会接近。例如,它们可以全部在1.000-2.000
范围内,也可以全部在16.000-20.000
范围内。数字总数将在到的范围内500-5.000
。
您的第一步是一个很好的步骤,因为排序将差异最小化。这是一种改进算法的方法:
霍夫曼编码的使用比您的步骤更重要。我会告诉你原因:
考虑以下数据:
1 2 3 4 5 6 7 4294967295
其中4294967295 = 2 ^ 32-1。使用您的算法:
1 1 1 1 1 1 1 4294967288
所需的总位数仍然是32 * 8
使用霍夫曼编码,频率为:
1 => 7
4294967288 => 1
霍夫曼码是1 => 0
和4294967288 => 1
所需的总位= 7 * 1 +1 = 8位
霍夫曼编码可将大小减少32 * 8/8 = 32倍
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句