优化只有3个不同值的数组?如何设计

optimize array with only 3 distinct values? How to design?

本文关键字:数组 3个 优化      更新时间:2023-10-16

我正在尝试C++中的一个资源不敏感功能。我正在实现一个有10000条记录的数组,但任何记录都只能有3个值,即0,1,2。所以我想知道,与其把10000个实例的内存全部存储在一起,如果有的话,我如何只保存每个实例的一个实例并进行逻辑管理。不确定具体如何实现。

例如,我的数组应该是这样的。

{1,0,0,1,2,1,1,0、2、2、0、0、2,………}

我们可能也会购买超过10000张唱片

听起来你只需要创建一个2500字节的数组,每个字节有4个值(每个值需要2位)。使用位移位/掩码访问任何单个值。我怀疑这将比对值进行分组的方案更简单,并且访问起来更像"数组"。当然,很难说,因为我们不知道你需要对价值观做什么。

实际上,您可以在每个字节中放入5个值(因为35是243),所以您只需要一个大小为2000的字节数组……但访问代码会有些棘手。我会抵制这种额外的复杂性,除非你真的需要它。

此外,如果值相对稀疏——例如,几乎所有值都是0,只有几个1和2——那么你显然可以更有效地存储它。

编辑:好吧,所以我已经很长时间没有做任何C++了,但它应该是这样的:

// Entirely untested. Please test thoroughly, and make sure you understand it
// before using it.
int get_value(unsigned index)
{
// TODO: Argument validation
unsigned raw_index = index / 4;
unsigned index_within_byte = (index % 4) * 2;
return (array[raw_index] >> index_within_byte) & 3;
}
void set_value(unsigned index, int value)
{
// TODO: Argument validation
unsigned raw_index = index / 4;
unsigned index_within_byte = (index % 4) * 2;
int mask = 0xff ^ (3 << index_within_byte);
array[raw_index] = (array[raw_index] & mask) | (value << index_within_byte);
}

编辑:进一步考虑,您甚至可能希望创建一个uint32_tuint64_t数组,而不是字节,并在每个数组元素中放入16或32个"实数"值。我怀疑在大多数处理器上,这可能会提高内存访问的效率。

制作一个std::pair<int, int>的向量,使得对的first包含0、1或2,而second包含特定元素被看到的次数。

以为例

{1,0,0,1,2,1,0、2、2、0、0、2………}

您可以像一样存储它

{<1,1>,<0,2>,<

只有当有大量连续重复并且不需要直接访问时,您才能看到它是好的。