我试图在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/