带约束的二维遍历算法

时间:2018-09-17 07:41:27

标签: algorithm queue

给出宽度m和高度n的二维数组。

我想将所有单元放入队列,以便我的k线程程序可以处理它们。

但是,一个重要的约束条件是,当同时处理两个8向邻居单元(例如(2,3),(2,4)(2,3),(3,3)(2,3),(3,4))时,就会出现冲突。

我该如何找到算法来生成这样的队列,希望在O(m*n)时间内?

顺便说一句,我设法限制了k < m*n/4(如果已经安全了,或者告诉我为了安全起见,我必须限制k有多小),以避免类似m=8,n=8,k=64的情况发生。 / p>

2 个答案:

答案 0 :(得分:1)

要开始:

将数组划分为k个矩形区域。

从左上角开始按锯齿形顺序按对角线扫描所有区域:

  (0,0)-(1,0)-(0,1)-(2,0)-(1,1)-(0,2)-(3,0)-(2,1)-(1,2)-(0,3)...

似乎通过这种方案,对邻居的处理是“按时间”分开的,因此发生冲突的可能性-当不同线程执行的速度不同时,发生冲突的可能性很小。

答案 1 :(得分:0)

IMO,一种有效的策略是将数组沿长边分成k个矩形,并沿短边逐行填充。相反,沿一个方向填充所有其他矩形。沿着同一边缘工作的两个线程之间将有很长的延迟,如果这样做,它们将在相邻的单元中非常简短地执行此操作(如果我是对的,它们最多可以在三个单元上发生冲突)。


如果禁止冲突,请分成k个矩形,并让每个线程填充下半部分(任意顺序)。然后让他们在障碍处等待。然后让它们填充下半部分。

您还可以实现k-1个互斥体,以禁止成对的相邻线程对相邻的两半起作用。