图算法中的最短路径与最小生成树算法解析
1. Floyd算法的并发实现
Floyd算法用于计算图中所有节点对之间的最短路径。下面是其并发实现的代码:
void cFloyds(float **D)
{
int k;
for (k = 0; k < V; k++)
parallel_for(blocked_range2d<int, int> (0, V, rGrainSize, 0, V, cGrainSize), tryK(k, D));
}
这段代码假设定义了两个常量 rGrainSize 和 cGrainSize ,用于设置TBB调度器将循环划分的最小行数和列数。这些值需要通过试验和错误测试来确定,以找到在不影响性能的情况下数组块可以达到的最小大小。
在地图应用中,虽然最初可能只需要下三角矩阵来计算两个城市之间的距离,但对于有向图,路径可能是单向的,或者往返路径的权重不同。因此,为了计算图中所有节点对之间的最短路径,需要对整个距离矩阵 D 进行计算。
1.1 k行的数据竞争问题
在串行算法中, k 循环的每次迭代都会访问 D 数组的所有条目以检查是否需要更新。在并发实现中,可能会出现两个线程 T0 和 T1 的交错执行情况,其中 T0 负责更新第 i </
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



