我想使用尽可能少的内存为图算法创建矩阵表示。
所以我决定尝试使用矩阵值的位表示,但我也知道用C做这个是(AFAIK)是不可能的,因为有点不可寻址。
然后我在这里读了一篇文章,建议使用一个可以帮助我这样做的结构,例如,使用int(4个字节,所以32位),并使用一些魔法和位移,将其用作“数组” “有点。
知道了,但我真的不知道我究竟能做到这一点。我很困惑......
我正在考虑使用一个结构来存储int / void指针,该指针指向对应于所分配的'n'个位数的最小字节数的n个字节,以及该表示中的'k'个位数,比如那个。
所以我认为你可以帮助我意识到这种解决方案的最佳方法是什么。
注意:为什么我这么困惑?我还在计算机科学专业毕业,刚开始学习图表。还完成了一个实验室项目(将其作为一个矩阵实现,但使用了一些mathemagic来仅分配矩阵的一半并将其表示为symectrical),但我正在尝试扩展此事。还因为我非常好奇:)
谢谢大家。
P.S。:差点忘了,我用C语言编程,但我能很好地理解C ++,.Net语言和Java。再次感谢。
答案 0 :(得分:0)
只是评论C中的位结构 - 看看这里:
这些应该是关于如何使用位结构的好指针。
答案 1 :(得分:0)
这里有一些棘手的问题:处理大型数组中的各个位;并使用1天模拟一个二维数组。最好先分开解决这些问题。
从一些帮助函数开始,可以处理各个位。类似的东西:
typedef unsigned int BYTE; /* Int type to use for data. */
#define BYTE_SIZE (sizeof(BYTE)*8) /* How many bits in each one. */
void set_bit(BYTE *data, int pos, int value)
{
int index = pos / BYTE_SIZE; /* Which byte to adjust. */
int offset = pos % BYTE_SIZE; /* Which bit within it. */
/* 1 << offset turns into the place value for the bit at offset. */
/* x | 1 << offset sets the bit there (an OR operation);
~(1 << offset) gets something with all bits except that bit set, and
x & ~(1 << offset) clears the bit with an AND operation on x. */
if (value)
data[index] = data[index] | (1 << offset);
else
data[index] = data[index] & ~(1 << offset);
}
int test_bit(int *data
{
int index = pos / BYTE_SIZE;
int offset = pos % BYTE_SIZE;
/* An AND operation to see if the bit is set, then compare against 0
so that 1 or 0 is returned instead of the place value. */
return (data[index] & (1 << offset)) != 0;
}
然后向上移动一个带有结构的级别来保存字节数组,以及一些有关维度的数据。通过将位(x,y)
上的操作转换为位y*width+x
上的操作,可以使用1-d模拟2维数组。
struct BITMATRIX
{
BYTE *data;
int width;
int height;
}
void set_bit_matrix(struct BITMATRIX *bm, int x, int y, int value)
{
int pos = y * bm->width + x;
set_bit(bm->data, pos, value);
}
/* Etc. */