【发布时间】:2010-03-23 12:55:05
【问题描述】:
对于我的大学过程,我正在模拟一个称为随机顺序吸附的过程。 我必须做的一件事是将正方形(不能重叠)随机放置到格子上,直到没有更多空间为止,重复该过程几次以找到平均“干扰”覆盖率。
基本上,我正在对大量整数执行操作,其中存在 3 个可能的值:0、1 和 2。标有“0”的站点是空的,标有“1”的站点是满的。最初数组是这样定义的:
int i, j;
int n = 1000000000;
int array[n][n];
for(j = 0; j < n; j++)
{
for(i = 0; i < n; i++)
{
array[i][j] = 0;
}
}
假设我想在数组上随机放置 5*5 个方块(不能重叠),这样方块就用 '1' 表示。这可以通过随机选择 x 和 y 坐标,然后创建一个 5*5 的 '1' 正方形,正方形的左上角从该点开始。然后我会将广场附近的地点标记为“2”。这些代表不可用的站点,因为在这些站点上放置一个正方形会导致它与现有的正方形重叠。这个过程将一直持续到没有更多空间可以在数组上放置正方形(基本上,数组上不再有 '0')
不管怎样,切中要害。我想通过使用按位运算使这个过程尽可能高效。如果我不必在广场附近标记站点,这将很容易。我想知道是否可以创建一个 2 位数字,以便我可以考虑标有“2”的站点。
对不起,如果这听起来很复杂,我只是想解释一下我为什么要这样做。
【问题讨论】:
-
大概,您确实意识到即使使用 2 位,您也需要大约 250,000 个大硬盘来存储阵列?由于在阵列的一个区域中发生/发生的事情不会影响其他区域超过几个方格,因此在如此大的范围内进行模拟将毫无意义,并且只会告诉您使用相当小的阵列所学到的更多信息。
-
是的,这不是 PB 范围吗?即使每个三进制像素使用 2 位也有点“浪费”。有可能构建某种系统,将三进制像素“打包”成二进制类型,如 64 位整数或其他类型。前六个二进制数 000,001,010,011,100,101 占用 18 位...如果每个“数字”是两位,则前六个三进制 00,01,02,10,11,12 占用 24 位。但它可能太慢了?这让我想起了 90 年代关于 PC 上的汇编编程的旧 Michael Abrash 书籍。
标签: c bit-manipulation integer bitwise-operators