我必须处理很多小数字的序列,大约一百万,我必须在 4KB 中放入尽可能多的(越多越好)。显然,空间太小,无法放置所有这些。此外,虽然这是一个特定的场景,但我希望得到一个尽可能笼统的答案。
数字不遵循任何模式,但这是一个小脚本必须说明的关于它们分布的内容:
407037 times 1
165000 times 2
85389 times 3
52257 times 4
34749 times 5
23567 times 6
15892 times 7
11183 times 8
7636 times 9
5402 times 10
3851 times 11
2664 times 12
2023 times 13
1547 times 14
1113 times 15
... many more lines ...
1 times 62
62 是我拥有的最大数字,所以让我们将我们关心的最大数字设置为 64。如果该方法很容易适应更大的最大数字,那就更好了。
这是一个数字示例:
20
1
1
1
13
1
5
1
15
1
3
4
3
2
2
一个简单的方法是每个数字使用 6 位,但我认为我们可以做得更好。
编辑:在评论讨论后添加一些信息。
我还有 2KB 的 ram 和微处理器上的十二个周期来解码每个数字。我需要从第一个数字开始按顺序存储尽可能多的数字。
编辑:请参阅 graybeard 的评论和我的跟进。
最佳答案
执行此操作的正确方法是 Rangecoding
, Huffman
或 Shannon-Fano
您可以在网络上的任何数字通信博客中看到它,所以我不会向您解释这些内容。
我可以向您推荐一个自定义方法,它非常简单,您可以将它与其他方法进行比较,看是否可以使用它来存储更多数字。
我看到没有 0's
在你的脚本中。所以只需将每个数字减 1(解码时,将解码结果加 1)。使用 4 位或 7 位对数字进行编码。所有数字最多 8
可以用 3 位来表示。如果号码是n <= 8
, 将第 1 位设置为 0
接下来的 3 位可以表示数字。否则,如果数字是 n > 8
,将第 1 位设置为 1,并将数字表示为从那里开始的 6 位。
虽然在Huffman
或 Shannon-Fano
, 很少有表示可以超过 20 bits
.
关于algorithm - 表示小无符号整数的最有效位格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34582710/