优化只有3个不同值的数组?如何设计
optimize array with only 3 distinct values? How to design?
我正在尝试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_t
或uint64_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>,<
只有当有大量连续重复并且不需要直接访问时,您才能看到它是好的。
- 如何在C++中比较两个char数组
- 在c++中获取两个大int,并将它们存储在数组中
- 如何以优化的方式同时迭代两个间距不相等的数组
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 如何从txt文件中读取多个不同长度的数组?
- C++,数组有多少个地址?
- 将字符串拆分为标记,并将标记拆分为两个单独的数组
- 为什么 2 个相同数组的元素彼此相等
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 可以将两个相同类型的连续数组视为一个数组吗?
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 使用嵌套函数数组是个好主意吗?
- 链表数组(5 个队列)
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 指向数组第一个元素的指针的地址
- 用 std::valarray 替换 POD C 样式数组是个坏主意吗?
- OpenGL:两个顶点数组 + 两个索引数组
- c++多维数组多个数据类型
- 使用C++AMP处理大型数组(65536+个元素)
- 在c++中使用MKL函数初始化数组是个好主意吗?