图算法中的搜索与路径计算
1. 并发深度优先搜索的交错分析
在并发快速排序算法中,排序完成后队列变空时,线程可能会等待一个不会增加的信号量,因为所有排序线程都在等待该信号量。为避免这种情况,会从一个排序线程发送信号表示排序完成,接收到信号的线程调用 ReleaseSemaphore() 函数,其计数等于排序线程的数量,使排序线程从信号量等待中返回并评估终止条件。
对于深度优先搜索,栈在搜索完成时是否会为空呢?乍一看似乎不会,因为访问节点时会将所有相邻节点压入栈中,搜索完成时栈中可能仍有已访问的节点。然而,存在一些特殊情况:
- 可能出现线程执行交错,最后一个要访问的节点弹出栈后,负责该节点的线程在其他栈项都弹出、发现已访问且其他线程都在等待信号量时才被允许执行。
- 若最后一个节点是一个独立的连通分量(只有节点,没有边),其他图的处理完成后,该节点最后从栈中弹出,此时其他线程会等待信号量。
所以,我们确实需要信号和外部源对信号量的加载。
2. 生成深度优先搜索线程
以下是调用 pDFSearch() 函数的代码片段:
for (i = V-1; i >= 0; i--) push(S, i); // load up initial stack
hSem = CreateSemaphore(NULL, V, V*V, NULL); // Initialize semaphore
for (i = 0; i < NUM_THREADS; i++)
hThreads[i]
超级会员免费看
订阅专栏 解锁全文

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



