关于具有邻接矩阵表示的非方向图

时间:2010-11-20 21:44:58

标签: c graph bit-manipulation

我想使用尽可能少的内存为图算法创建矩阵表示。

所以我决定尝试使用矩阵值的位表示,但我也知道用C做这个是(AFAIK)是不可能的,因为有点不可寻址。

然后我在这里读了一篇文章,建议使用一个可以帮助我这样做的结构,例如,使用int(4个字节,所以32位),并使用一些魔法和位移,将其用作“数组” “有点。

知道了,但我真的不知道我究竟能做到这一点。我很困惑......

我正在考虑使用一个结构来存储int / void指针,该指针指向对应于所分配的'n'个位数的最小字节数的n个字节,以及该表示中的'k'个位数,比如那个。

所以我认为你可以帮助我意识到这种解决方案的最佳方法是什么。

注意:为什么我这么困惑?我还在计算机科学专业毕业,刚开始学习图表。还完成了一个实验室项目(将其作为一个矩阵实现,但使用了一些mathemagic来仅分配矩阵的一半并将其表示为symectrical),但我正在尝试扩展此事。还因为我非常好奇:)

谢谢大家。

P.S。:差点忘了,我用C语言编程,但我能很好地理解C ++,.Net语言和Java。再次感谢。

2 个答案:

答案 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. */