【发布时间】:2022-01-21 13:49:42
【问题描述】:
我正在研究一些繁重的算法,现在我正在尝试使其成为多线程的。它有一个带有 2 个嵌套循环的循环:
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j + 1; k < n; ++k) {
function(i, j, k);
}
}
}
我知道,function 的调用次数将等于
但我还有最后一个问题:我不知道如何根据b (0 <= b < binom(n, 3)) 计算i、j 和k
for (int b = start; b < end; ++b) {
// how to calculate i, j, k?
}
如何计算这些值?
编辑: 我的主要想法是从不同的线程调用这样的函数:
void calculate(int start, int end) {
for (int b = start; b < end; ++b) {
int i = ...;
int j = ...;
int k = ...;
function(i, j, k);
}
}
int total = binom(n, 3);
// thread A:
calculate(0, total / 2);
// thread B:
calculate(total / 2, total);
【问题讨论】:
-
b 到底是什么?我不认为我理解这个问题......
-
@MichalBurgunder 我已经更新了问题
-
为什么不将 3 个 for 循环留在
calculate中,并让每个线程调用calculate以获取[0, total/2)和[total/2, total),就像您目前所做的那样?最后,调用次数(复杂度)是相同的,您使用增量而不是公式(更快)计算i、j和k。 -
@congard 酷;我理所当然地认为您在将代码更改为多线程代码时正在寻找性能,但我知道情况不一定如此。
-
我投票结束这个问题,因为这是一个似乎与编程没有直接关系的数学问题。您可能想在math.stackexchange.com 上提问
标签: c++ multithreading math