我试图在C中定义一个有100000列和100000行布尔类型的矩阵(bool matrix[100000][100000]),我该怎么做?

最佳答案

从技术上讲,定义与声明完全不同。我想你是在要求一个类型同义词。

typedef bool matrix[100000][100000];

类型matrix现在被定义为bool[100000][100000]的类型同义词。
matrix *m = malloc(sizeof *m);

m被声明为指向matrix的指针,并初始化为适当的malloc调用的返回值。
static matrix s;

s声明为具有静态存储持续时间的matrix,如注释中所建议的。
这真的很低效如果不打算使用所有这些元素,也许可以尝试使用某种有序映射我写了一本你可以用的书,叫做帕特里夏·特里亚,你可以找到here。如果您确实计划使用所有这些元素,那么您可以通过使用数组中的所有位(而不是通常是其中的1/8或更糟的位)来节省大量内存(和时间,以缓存未命中的形式),浪费的形式是填充这需要一些稍微复杂一点的逻辑。
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned char matrix[100000][100000 / CHAR_BIT + (100000 % CHAR_BIT > 0)];

int matrix_get(matrix *m, size_t x, size_t y) {
    return ((*m)[x][y / CHAR_BIT] >> (y % CHAR_BIT)) & 1;
}

void matrix_set(matrix *m, size_t x, size_t y, int value) {
    (*m)[x][y / CHAR_BIT] &= ~(1U    << (y % CHAR_BIT));
    (*m)[x][y / CHAR_BIT] |=   value << (y % CHAR_BIT) ;
}

int main(void) {
    matrix *m = malloc(sizeof *m);
    memset(m, 0, sizeof *m);
    matrix_set(m, 0x1337, 0xC0DE, 1);
    printf("%d\n", matrix_get(m, 0x1337, 0xC0DE));
}

关于c - 如何用C制作一个巨型矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30574904/

10-11 20:57