我有以下嵌套的for循环:
int n = 8;
int counter = 0;
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
printf("(%d, %d)\n", i, j);
counter++;
}
}
它按预期打印 (0,1) 到 (6,7) 并且printf()
语句运行 28 次,如counter
.
我的任务是通过提高它的局部性来提高这段代码的效率(这是测试代码,n
实际程序中的值要大得多,i
并且j
用于索引两个一维数组)并采用了我相信是一种相当标准的技术:
int chunk = 4;
for(int i = 0; i < n; i+=chunk)
for(int j = 0; j < n; j+=chunk)
for (int i_chunk = 0; i_chunk < chunk; i_chunk++)
for (int j_chunk = i_chunk + 1; j_chunk < chunk; j_chunk++)
{
printf("(%d, %d)\n", i+i_chunk, j+j_chunk);
counter++;
}
但是,这里printf()
只运行了 24 次,因为这j_chunk = i_chunk + 1
意味着在j
循环打印 (0,1) 到 (0,7) 之前,循环的两次迭代j_chunk
打印i+i_chunk == 0
(0,1) 到 (0,3) 和(0,5) 到 (0,7) 缺少 (0,4)。
我理解它为什么会这样做,但我无法为我的生活想出一个解决方案;任何帮助,将不胜感激。