algorithm - 表示小无符号整数的最有效位格式

标签 algorithm

我必须处理很多小数字的序列,大约一百万,我必须在 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 , HuffmanShannon-Fano您可以在网络上的任何数字通信博客中看到它,所以我不会向您解释这些内容。

我可以向您推荐一个自定义方法,它非常简单,您可以将它与其他方法进行比较,看是否可以使用它来存储更​​多数字。

我看到没有 0's在你的脚本中。所以只需将每个数字减 1(解码时,将解码结果加 1)。使用 4 位或 7 位对数字进行编码。所有数字最多 8可以用 3 位来表示。如果号码是n <= 8 , 将第 1 位设置为 0接下来的 3 位可以表示数字。否则,如果数字是 n > 8 ,将第 1 位设置为 1,并将数字表示为从那里开始的 6 位。

虽然在HuffmanShannon-Fano , 很少有表示可以超过 20 bits .

关于algorithm - 表示小无符号整数的最有效位格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34582710/

相关文章:

c++ - 从 std::string 获取类型,C++

"median of medians"算法的Python实现

algorithm - 将图划分为具有最小割的相同大小的不相交集

algorithm - 这个问题的名称是什么?

algorithm - Topcoder SRM 624 DIV II 3 级

c++ - 为什么这个Deque析构函数有内存泄漏

algorithm - 创建基于优先级的循环算法

python - 从具有级别的列表构建树

java - 在 Java 8 中如何从 N 个数字中找到最大的 M 个数字?

Javascript比较多个对象数组