Data structures 基于像素的模式识别的数据结构

Data structures 基于像素的模式识别的数据结构,data-structures,pattern-matching,Data Structures,Pattern Matching,我有一个基于约束构造随机图像的应用程序。随机选择不同颜色的像素并将其放置在满足所有约束的网格中。例如(简化),可能存在一个约束,即如果蓝色或绿色像素位于(0,-1),红色像素位于(-1,-1)和(-1,0),则禁止放置白色像素。这些坐标是来自当前放置位置(即其邻域)的向量 现在,我将约束存储在一个数组中,并在其中循环,检查每个约束是否适用。我必须对网格中放置的每个像素执行此操作。因此,当添加更多约束时,性能会受到影响。此外,两个约束可能存在冲突,但要检查这一点并不容易 我认为图形类型的数据结构(

我有一个基于约束构造随机图像的应用程序。随机选择不同颜色的像素并将其放置在满足所有约束的网格中。例如(简化),可能存在一个约束,即如果蓝色或绿色像素位于(0,-1),红色像素位于(-1,-1)和(-1,0),则禁止放置白色像素。这些坐标是来自当前放置位置(即其邻域)的向量

现在,我将约束存储在一个数组中,并在其中循环,检查每个约束是否适用。我必须对网格中放置的每个像素执行此操作。因此,当添加更多约束时,性能会受到影响。此外,两个约束可能存在冲突,但要检查这一点并不容易


我认为图形类型的数据结构(树?)可能是存储所有约束的一种方式,这样我可以从像素邻域快速确定应用了哪些约束(如果有的话)。但考虑到一个坐标可以包含多种颜色,以及如何将一组坐标/颜色与一组禁止使用的像素颜色绑定在一起,我无法完全理解如何使这种结构起作用。有什么想法吗?

对于这个问题,你可以使用不同类型的树

这似乎是一个被广泛研究的话题,答案可能会比正常答案长得多。请参阅以下链接:


我们没有使用过模式匹配,但想到的是:

以通常的图形ds为例,其中顶点是向量,边是禁止连接它们的颜色。 在这里,你可以连接彼此之间的所有顶点,更优化的方法是采用一些方向,你将使用填充你的ds,你应该使用相同的起点和方向,当你将通过像素阵列。 从你的例子中,如果你从(0,-1)开始顺时针走,它会是这样的:(0,-1)--蓝色--(1,-1),(0,-1)--绿色--(1,-1),(1,-1)--红色--(1,0),(1,1)--白色--(1,1),(1,1)--(1,0)


现在使用DFS搜索颜色以进行检查(将是边缘)

在我看来,一个方便的选择是kd树。通过将约束存储在kd树中,您可以访问应用于最近邻类型查询的约束

我建议你看看这本书。您可以找到可能适用于您的问题的kd树


但是,请记住,如果约束在场景中分布不均匀,则生成的树可能无法很好地平衡。在这种情况下,您应该找到更好的约束表示,否则算法的实际复杂度将更接近最差值O(n),而不是平均值(和最佳值O(logn)。

您可以使用图切割来解决此问题。它甚至会处理提到的冲突。这就是它的基本工作原理:它尝试根据您希望最小化的成本函数分配标签。对于您的情况,成本函数可能类似于:

E(x)=infinite ; if constraint is violated
and  0        ; otherwise
图形切割将指定最小化此成本函数的标签。此外,它是非常快速和有效的,并收敛到极小值。请查看以下两个参考资料:


  • 第二个链接提供了图形切割的现成代码,您可以在其中使用自己的成本函数,该函数将被最小化(并且可以像您的情况一样依赖于相邻值)。

    谢谢!这看起来确实是正确的追求方向。我以前从未听说过图形切割。