c - 是否有一种节省空间的方法来存储和检索数据集的顺序?

标签 c data-structures embedded bit-manipulation

这是我的问题。我有一组 20 个对象作为数组存储在内存中。我想存储第二条数据,用于定义要显示的对象的顺序。

存储顺序的最简单方法是作为一个包含 20 个无符号整数的数组,每个整数为 5 位(又名 0-31)。对象在输出列表中的位置将由存储在该数组中的数字定义,索引与数组中的对象相同。

但是.. 我从统计上知道只有20个! (那是 20 阶乘),排列这些对象的方法。 这可以存储在 62 位中,因为 2^62 > 20!

我目前使用 100 位来存储相同的信息。

所以我的问题是:是否有一种节省空间的方式将 ORDER 存储为位序列?

我也有一些附加限制。这将在嵌入式设备上运行,所以我不能使用任何巨大的数组或高级数学函数。我需要一个简单的迭代方法。

编辑:澄清为什么这是必要的。例如,对象是图片,它们存储在 ROM 中(也就是它们不能四处移动)。现在假设我想跟踪显示图像的顺序,我将每秒更新一次该顺序。我的设备有 1k 的存储空间和磨损均衡,但存储空间中的每个位只能写入 1000 次才会变得不可靠。如果我需要 1kb 来存储订单,那么我的设备只能工作 1000 秒。如果我需要 0.1kb,它将工作 10k 秒,依此类推。因此,设备生命周期将与我每个周期需要更新的位数成反比。

最佳答案

您可以将订单存储在单个 64 位值 x 中:

  • 对于第一个选择,20 种可能性,将索引计算为 x % 20 并将 x 更新为 x/= 20,<
  • 对于下一个选择,只有 19 种可能性,计算 x % 19 并将 x 更新为 x/= 19
  • 继续此过程 17 次,您就完成了。

关于c - 是否有一种节省空间的方法来存储和检索数据集的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49565511/

相关文章:

"short"的 C 数值常量后缀

c - Linux C : Changing process name during compilation

c - 结构声明中的结构数组 : "array type has incomplete element type"

embedded - trace32 - 将多个地址范围的内存转储到单个二进制文件

在 ncurses 中按 Enter 键后光标不会移动到新行

JavaScript Array、Stack、Queue——这种特定 API 设计背后的动机是什么?

java - 实现多键值映射

java - 包含 k 个列表中每个列表中至少一个数字的最小范围

c - 定义 FREERTOS_USED 符号后 Atmel UC3A0512 FAT API 问题

linux - Console_init 导致内核崩溃