布尔值的轻量级矩阵

发布于 2025-01-06 03:08:20 字数 202 浏览 2 评论 0原文

我需要实现一个非常大的矩阵,比如标准 C 中的 NxN。该矩阵必须存储一个真值表,也就是说

matrix[i][j] = [true|false]

我知道我可以简单地使用 int 矩阵或 boolean type 如果使用 C99,但正在寻找内存方面最轻量级的解决方案。

I need to implement a very large matrix, say NxN in Standard C. The matrix must store a truth table, that is

matrix[i][j] = [true|false]

I know I could simply use a int matrix, or boolean type if using C99, but was looking for the most lightweight solution in terms of memory.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

巨坚强 2025-01-13 03:08:20

就内存而言,最轻量级的解决方案是将八个布尔值保存在一个字符中:

unsigned char getBit(char byte, unsigned short bit){
    assert(bit < 8);
    return byte&(1<<bit);
}

然后您可以通过保存每行中的字节来存储 N x 8M 矩阵。如果其中许多字节为空,那么您应该使用稀疏矩阵格式,例如压缩备件行。

The most lightweight solution in terms of memory is saving eight boolean in a char:

unsigned char getBit(char byte, unsigned short bit){
    assert(bit < 8);
    return byte&(1<<bit);
}

Then you can store a N x 8M matrix by saving the bytes in each row. If many of those bytes are empty then you should use a sparse matrix format, for example compressed spares row.

好多鱼好多余 2025-01-13 03:08:20

如果矩阵特别稀疏,您可能需要使用哈希实现或列表列表。

此外,如果 i 或 j 小于系统可以存储的最大整数,您可以将布尔位集打包为单个整数,其中每一位对应一个索引。然后,您可以使用按位运算来访问或修改它。

You might want to use a hash implementation or a list of lists if the matrix is particularly sparse.

Also if the i or j is less than the largest integer your system can store you can pack a boolean bitset into a single integer with each bit corresponding to one index. You can then access or modify this using bitwise operations.

孤独患者 2025-01-13 03:08:20

这不是 std::bitset 的用途吗?

Isn't it what std::bitset is for ?

顾铮苏瑾 2025-01-13 03:08:20

是否有更有效的解决方案

如果您想在一位中存储超过 1 个布尔值,则需要使用一些压缩。

压缩仅适用于非随机数据;并且随机访问压缩数据可能会很慢。

最简单的一种方法是 RLE(独立压缩每一行)。稍微复杂一点的是将数据存储在稀疏矩阵中(仅当 0 值远多于 1 时;此方法可以压缩多维数据)。

这里使用了更复杂的压缩:http://crd-legacy.lbl。 gov/~kewu/fastbit/index.html 它被命名为 "字对齐混合压缩方案"

if there is a more efficient solution

If you want to store more than 1 boolean in single bit, you need to use some compression.

Compression will work only on non-random data; And random access to compressed data can be slow.

Easiest one method is RLE (compress each row independently). A bit more complex is storing data in sparse matrix (only if you have much more 0 values than 1; this method can compress multi-dimensional data).

Much more complex compression is used here: http://crd-legacy.lbl.gov/~kewu/fastbit/index.html It is named "Word-Aligned Hybrid compression scheme"

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文