使用像素检测方块

时间:2012-10-12 03:37:25

标签: sql postgresql graphics relational-algebra

这是一个有趣的问题。假设我在sql db上有一个表,其中填充了x,y坐标(正象限),每个都有一个颜色值,即模式看起来像<x , y, color>。任务是检测具有相同颜色的最大可能正方形。我一直试图解决这个问题好几个小时,似乎无法解决这个问题。

我不是在寻找解决方案,而是提示。

请注意,这一切都必须在SQL中发生,主要是使用各种连接,分组和聚合操作。一些示例代码会很好。

2 个答案:

答案 0 :(得分:2)

假设你的问题空间很小,让我们说10x10(x在1到10之间),然后是一种天真而野蛮的方法:

  1. BotLeft:CROSS JOIN两组10个数字(说Numbers表的子集)给你所有可能方块的左下角(100分)
  2. TopRight:CROSS加入相同的两套以获得所有积分
  3. 正方形:两者之间的INNER JOIN,按BotLeft必须位于左侧和顶部TopRight下方进行过滤
  4. 给定所有可能的正方形,通过最终连接到您的数据来测试每个正方形,其中(x,y)坐标落在正方形的边界内,例如left <= x <= right。这会产生一个庞大的集合
  5. 使用GROUP BY(左下角,右上角)折叠上一组,并测试分组子集中的不同颜色,例如HAVING COUNT(DISTINCT color) = 1
  6. 如果您的数据集未完全填充,那么您还需要测试每个方格中的COUNT像素=找到的数据点数

答案 1 :(得分:2)

如果您只请求角落颜色相同,则可以

top left corner
join top right corner on equal x and color and greater y
join bottom left corner on equal y and color and greater x
join bottom right on equal x, y and color
order by (x1-x2)*(y1-x2) descending
limit 1

当然,限制1不会对性能产生太大影响,因为无论如何它都必须生成所有正方形。

您可以通过添加(颜色,x,y)和(颜色,y,x)索引来(大大)提高速度。 执行计划很可能最终结束:

(1) full scan for all top left corners
(2) dependent index scan for all top right corners
(3) dependent index scan for all bottom left corners
(4) dependent index scan for the bottom right corner expecting at most one match
(5) (partial) table sort of the entire set of squares (cannot use indexes)