我需要实现一个非常大的矩阵,比如标准C中的NxN。矩阵必须存储一个真值表,即
matrix[i][j] = [true|false]
我知道如果使用C99,我可以简单地使用int
矩阵或boolean
类型,但是在内存方面寻找最轻量级的解决方案。
答案 0 :(得分:4)
就内存而言,最轻量级的解决方案是在char中保存八个布尔值:
unsigned char getBit(char byte, unsigned short bit){
assert(bit < 8);
return byte&(1<<bit);
}
然后,您可以通过保存每行中的字节来存储N x 8M
矩阵。如果其中许多字节为空,那么您应该使用稀疏矩阵格式,例如压缩备用行。
答案 1 :(得分:2)
如果矩阵特别稀疏,您可能希望使用哈希实现或列表列表。
此外,如果i或j小于系统可以存储的最大整数,则可以将布尔位集打包为单个整数,每个位对应一个索引。然后,您可以使用按位运算来访问或修改它。
答案 2 :(得分:0)
这不是std :: bitset的用途吗?
答案 3 :(得分:0)
如果有更有效的解决方案
如果要在单个位中存储多于1个布尔值,则需要使用一些压缩。
压缩仅适用于非随机数据;随机访问压缩数据可能会很慢。
最简单的一种方法是RLE(独立压缩每一行)。更复杂的是将数据存储在稀疏矩阵中(仅当您有超过1的0值时;此方法可以压缩多维数据)。
此处使用了更复杂的压缩:http://crd-legacy.lbl.gov/~kewu/fastbit/index.html它名为"Word-Aligned Hybrid compression scheme"