【问题标题】:Detecting Squares using pixels使用像素检测正方形
【发布时间】:2012-10-12 03:37:24
【问题描述】:

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

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

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

【问题讨论】:

  • 正方形周长还是实心正方形?

标签: sql postgresql graphics relational-algebra


【解决方案1】:

如果你只要求角落是相同的颜色,你可以这样做

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 不会对性能产生太大影响,因为无论如何它都必须生成所有正方形。

您可以(极大地)通过添加 (color,x,y) 和 (color,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)

【讨论】:

  • 很有道理,非常感谢!你为我节省了很多时间。
【解决方案2】:

假设您的问题空间很小,假设是 10x10(x 介于 1 和 10 之间),那么一种天真的方法:

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

【讨论】:

  • a.color=b.color AND ... 在速度方面不是比 COUNT DISTINCT 更好吗?
  • 是的,您可以将该优化纳入第 4 步,只收集类似的颜色。我确实说过这是一种天真的方法。我毫不怀疑它会起作用并显示逻辑,但我也确信它不是最快的方法。如果你真的想要,你甚至可以早在第 2 步就引入颜色匹配。
猜你喜欢
  • 1970-01-01
  • 2011-12-31
  • 2021-01-26
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
相关资源
最近更新 更多