问题:
我有一个填充了各种标签的大型双(2d)阵列。 double数组中的每个元素(单元格)都包含一组标签,double数组中的某些元素可能为空。我需要一种算法将双数组中的元素聚类成离散的段。段被定义为在双数组内相邻的一组像素和一个标记,该段中的所有那些像素具有共同点。 (对角线邻接不计算,我没有聚集空单元格。)
|-------|-------|-------|
| Jane | Joe | |
| Jack | Jane | |
|-------|-------|-------|
| Jane | Jane | |
| | Joe | |
|-------|-------|-------|
| | Jack | Jane |
| | Joe | |
|-------|-------|-------|
在上面分布在九个元素上的标签排列中,最大的簇是占据四个左上角单元的“Jane”簇。
我考虑过的事情:
我已经考虑过迭代双数组中每个单元格的每个标签并测试以查看检查中的单元格标签组合是否可以与预先存在的段相关联。如果检查中的元素不能与预先存在的段相关联,则它将成为新段的第一个成员。如果标签/单元格组合可以与它关联的预先存在的段相关联。
当然,为了使这种方法合理,我必须实现一个精心设计的哈希系统。我必须跟踪与预先存在的段相邻的所有单元标签组合,并且在迭代通过双数组的递增索引的路径中。这种哈希方法可以避免迭代每个预先存在的段中的每个像素来找到邻接。
为什么我不喜欢它
原样,上述算法没有考虑双阵列中的元素可以与两个唯一的段相关联的情况,一个在水平方向上,一个在垂直方向上。为了正确处理这些情况,我需要为这个特定情况实现一个测试,然后实现一个方法,它既将检查中的元素与一个段相关联,然后连接两个相邻的相同段。
总的来说,这种方法和它需要的错综复杂的散列系统感觉非常不优雅。另外,我真的只关心在双数组中找到大段,我更关心这个算法的速度而不是分段的准确性,所以我正在寻找一种更好的方法。 我假设有一些随机的方法可以做到这一点,我没有想过。
有什么建议吗?
修改
我想要的输出是一个段列表,每个段是一个标签和一个点列表。因此,在上面的示例中,我希望返回两个段:
Segment 1 - Jane: (1,3), (2,3), (1,2), (2,2)
Segment 2 - Joe: (2,3), (2,2), (2,1)
答案 0 :(得分:2)
你基本上想要实现泛洪填充算法 - 将数组视为一组图像,每个不同的标签一个,标签是一种颜色,缺少标签是黑色;然后,您希望将其分割为该颜色的所有连接组件。
重复所有标签,你就完成了。
如果您的标签很稀疏,那么最好不要为每个标签创建图像并使用现有的填充程序。在这种情况下,通过创建阵列的副本并在破坏现有标签的同时构建一个标签的连接块来进行自己的广度优先填充。
我打算将一个条目称为“像素”,将整个数组称为“图像”。
该算法大概是
for each pixel in the image
for each label in the pixel
1. remove the label
2. mark the current pixel
3. for each marked pixel, look in every adjacent pixel for the label
4. remove any labels found
5. if labels are found, clear marks, and mark the newly label-removed pixels
6. if anything is marked, go back to 3
7. report the set of points where you removed labels
由于这是破坏性的,您不必担心回溯。 (如果你不能破坏你的原件,也不能制作副本,那么你必须跟踪你在路上所做的事情,这更麻烦。)