局部性得到改进时嵌套的 for 循环的范围 (C++)
Ranges of nested for-loops when locality is improved (C++)
我有以下嵌套的循环:
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
用于索引到两个 1d 数组中),并采用了我认为相当标准的技术:
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)。
我理解它为什么要这样做,但我一生都想不出解决方案;任何帮助将不胜感激。
首先,您需要确保j
永远不会低于 i
的块中,因此您的外部循环应该是:
for(int i = 0; i < n; i+=chunk)
for(int j = i; j < n; j+=chunk)
然后,您需要根据i
和j
是否在同一块中来执行不同的行为。如果是,j_chunk
需要全部大于 i_chunk
,否则您需要经历所有可能的组合:
if(i==j)
{
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++;
}
}
}
else
{
for (int i_chunk = 0; i_chunk < chunk; i_chunk++)
{
for (int j_chunk = 0; j_chunk < chunk; j_chunk++)
{
printf("(%d, %d)n", i+i_chunk, j+j_chunk);
counter++;
}
}
}
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- C++ Python 循环"for i, num in enumerate(list):"版本
- C 多循环 for () 基础知识
- 没有条件值的 FOR 循环"for (int i = 1; ; i++)"无法正常工作
- 为用户提供循环for循环的选项
- 打破循环for循环