颜色列表中最接近的RGB颜色

时间:2019-02-07 21:17:37

标签: algorithm sorting data-structures colors geometry

我正在接受采访,被要求为以下问题创建一种有效的算法:

输入:

我们有一个RGB颜色列表。由3坐标<x,y,z>表示的每种颜色都介于0到255之间。此列表永远不变。

我们每次都会得到一些其他颜色(不一定是上面列表中的不是),我们需要将列表中最接近的颜色(就距离而言)返回到其他颜色。

注释:

  1. 我们可以对颜色列表进行一些预处理,因为颜色列表永远不会改变。

  2. 颜色之间的距离定义为: d = ((x2 - x1)^2 + (y2 - y1)^2 + (z2 - z1)^2)^1/2

示例:

让:列表:{<1,1,1>,<1,0,1>,<2,2,2>,<0,1,0>} 其他颜色:<0,0,0>

结果:到<0,0,0>的最小距离是<0,1,0>

我试图解决的问题:

  1. 显然,我们可以进行预处理,并保留世界上所有的颜色对,并节省距离,并且可以在O(1)运行时获得解决方案,但具有巨大的内存{{1 }}

  2. 最幼稚的解决方案是遍历列表,计算列表中每种颜色到其他颜色之间的距离,并以最小距离返回该颜色。取(255^3*n),其中n是颜色列表的长度。

我试图用x,y,z坐标对列表进行某种排序,并保留3个排序后的列表或按与O(n)的距离排序,但是我不知道如何继续进行。

我还看到了this,但问题不在于解决问题的算法方法。

1 个答案:

答案 0 :(得分:6)

如今,预计算完整的查找表并不是那么不可思议。只要您的参考色少于256种,所需的数组就会有256³(不是255³)条目,即17 MB。 (用于65536色的双色。)但是您确实有充分的理由使用这种设备。

如果颜色数量合理,那么天真的解决方案是可以接受的。

对于更大数量的颜色(例如从10种开始),可能有几种实用的解决方案:

  • kD树(其中k = 3);查询时间接近O(Log N);

  • 八叉树;如果颜色没有聚类,则查询时间接近O(Log N);

  • 一个网格(例如4096个大小为16的单元格);查询时间O(N),但在幸运的情况下,可以使渐近常数非常小。

计算几何工具可能会建议将3D Voronoi图组合到3D细分中的定位器上,但是它们虽然复杂,并且难以实现,即使它们将支持有保证的O(Log N)查询时间。

我个人更喜欢kD树。

相关问题