我目前的任务是在数据库系统中实现 CCL 算法(用 C++ 编写)。该算法将为给定多维数组中超过阈值的所有值分配一个标签,并且相邻的标签值将具有相同的标签。
编写一个基本的 CCL 算法并不难,但在我的领域中,输入数组是随机分区到数据库的多个实例中的。当我的 CCL 操作符被调用时,每个实例都会对其负责的数据块执行操作并返回其本地 CCL 结果。然后将这些本地结果合并以产生最终结果。
我不知道在运行时哪个实例负责数组的任何给定部分,并且实例在最后的合并步骤之前无法相互通信。
-=-=-=-
目前,我通过执行以下操作来完成此工作:
每个实例创建一个布尔值数组,其大小等于数组中的项目数,并将所有值设置为 FALSE。
每个实例都会检查它负责的值并检查这些值是否超过阈值;如果是,则将其本地数组中的相应布尔值更改为 TRUE。
实例都将它们的数组发送到协调器,协调器使用 OR 组合结果以创建最终的布尔向量。
协调器遍历数组中的每个值,跳过已经标记的值。如果该值未标记并且对应于该值的布尔值为真,则它为其分配一个新标签并递归地为其所有邻居(以及邻居的邻居等)分配相同的标签。
返回标签向量。
上述算法有效,但利用多个实例的唯一优势是阈值计算。因为这个实现只是简单地收集所有东西并在协调器上扫描它,所以它首先破坏了使用多个实例的意义。
-=-=-=-
本质上,这个算法被自动地变成了一种分治算法,但是这种划分是完全不可控的随机的。
我们希望通过在每个实例上执行两次 CCL 扫描,然后在协调器上组合这些本地 CCL 结果来利用这种划分;也就是说,如果两个实例产生了一组彼此相邻的标签,我们希望将这两个标签组合起来,而不是再次扫描每个值。这个斜体字是给我们带来最大麻烦的地方,我们不知道如何进行。如果有人对算法或数据结构有建议可以很好地研究,将不胜感激。