【问题标题】:Efficient way of minimizing memory footprint of set of numbers最小化一组数字的内存占用的有效方法
【发布时间】:2014-07-10 10:13:53
【问题描述】:

我正在使用 .Net Micro Framework 为嵌入式设备编写代码,我有一组计算出的整数,如下面的链接所示,我需要访问这些整数,但如果可以以某种方式最小化这些信息,我希望它,基本上我有一个从 150 到 4 的数字列表,每个数字都有一个可以链接到的相邻数字列表,例如 150 可以链接到 149、148、146、144、142 等,一些数字(150 到4) 共享链接号码 150 和 149 共享 91 作为示例以及许多其他号码,所以我认为必须有某种方式来表示所有这些数字,因为内存占用减少了,因为有很多共享链接号码,任何建议会很棒。

https://www.dropbox.com/s/qqn8097571r9s27/LinkedNumbers.txt

示例数据

150 = 149、148、146、144、142、140、138、136、134、99、93、92、91、87

149 = 148、147、145、143、141、139、137、135、133、131、129、103、102、97、96、93、92、91

148 = 147、146、145、144、142、140、138、136、134、132、99、97、94、92、91、88、87、86

147 = 146、145、144、143、141、139、137、135、133、131、95、91、90、89、88

【问题讨论】:

  • 在您的问题中包含示例数据,很有可能永远不会点击文件下载链接
  • 数列遵循的算法是什么?
  • 我不认为解释这些数字是如何产生的,我只是希望有一种方法可以将它们压缩一点
  • 但是在不知道它们背后的逻辑的情况下,我们无法知道如何压缩它。
  • 现在最明显的是每个数字只需要 8 位,因此您可以将其中的 3 个打包成 32 位整数,将 6 个打包成 64 位整数

标签: c#


【解决方案1】:

将每一行存储为一个 19 字节的位序列,其中 1 表示列表中的条目,0 表示列表中不存在的值。

例如,您的第一个条目是:-

150 = 149, 148, 146, 144, 142, 140, 138, 136, 134, 99, 93, 92, 91, 87,
      83, 79, 77, 65, 63, 59, 55, 54, 53, 51, 49, 48, 47, 46, 45, 44, 
      43, 42, 41, 40, 39, 38, 37, 35, 34, 33, 31, 29, 27, 25, 23, 22, 
      21, 19, 18, 17, 14, 13, 12, 11, 9, 8, 7, 6, 5, 4, 3, 2

可以存储为:-

150 = 0,0,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0.....

第一位代表0,第二位代表1,以此类推

您可以通过减少每行使用的位数来提高存储效率,但是要检查的位的计算变得有点复杂。使用它,整个批次可以存储在 1416 字节中。

【讨论】:

  • 谢谢,这会压缩 8 倍吗?
  • @chillydk147:使用二维位数组,是的,每个值使用一位,因此 8 倍很容易做到。如果你使用三角法,它会变成 16 倍。
  • 三角法是什么?
  • @chillydk147:减少为每行存储的值的数量。所以 150 的行有 149 个数字,第 4 行有三个数字。如果您创建了一个顶部为 0-150,侧面为 1-150 的表格,并在行数映射到列数的单元格中放置 1,则一半的网格将为空 - 因此是三角形的。通过利用一半网格是空的这一事实,您可以将压缩因子加倍。
  • 啊,是的,我现在明白了,随着行号变小,它们相邻的数字会越来越少
【解决方案2】:

如果两个序列号之间的最大减量不超过,例如 64,那么您可以将每个序列存储为 6 位无符号减量值列表。

例子:

150 = 149, 148, 146, 144, 142, 140, 138, 136, 134, 99, 93, 92, 91, 87

成为:

150 =   1,   1,   2,   2,   2,   2,   2,   2,   2, 35,  6,  1,  1,  4

【讨论】:

  • 有趣,应该会减少一点
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
相关资源
最近更新 更多