我的数据库中有一个“颜色”表。

用户通过用户界面输入颜色,后端搜索颜色表中存在的最相似的颜色,计算 HCL 空间中颜色的距离。

我将实现一个缓存算法,该算法应该存储先前计算的颜色距离之间的距离,以避免重复的数学运算。

用于此目的的最佳表格布局是什么?

有帮助吗?

解决方案

正如奥萨马所说,这看起来像是过早的优化。根据您对算法的描述,我会:

  • 预先计算数据库中所有颜色的 HCL 向量,并存储一个将颜色 ID 映射到其 HCL 向量的表。
  • 该表应使用以下方式存储 MySQL 空间扩展, ,它允许您查询点的邻居。
  • 选择新颜色后,将其转换为 HCL,并在 HCL 空间中查询其点的邻居。
  • 如果确实需要缓存,我会缓存粗粒度的颜色,因此用户有可能重新访问之前选择的颜色。

其他提示

你可以这样做:

table colors(r,g,b)
table colordistance(user_r,user_g,user_b,r,g,b,distance)

但你希望你的用户继续输入相同的数字???在该表中的行的最大数目是16777216如果仅包括最接近的颜色。

我仍然怀疑,对数据库的访问比计算更慢,所以我报价的思考“的过早的优化是一切罪恶的根源的。”

我将运行它,而不计算任何缓存直到我看到它作为一个实际的问题。

我假设你的颜色“距离”作为类似计算:

sqrt((r1-r2)^2 + (g1-g2)^2 + (b1-b2)^2)

假设使用的是8位的像素,就在表中(256 ^ 3)^ 2个不同映射。这就是表空间了很多。 (你也许可以压缩了很多,但是......看到下一个点。)

您需要考虑的另一件事是数据库查询,找到一个颜色距离 - 这样计算的成本费用。我的猜测是,一个数据库查找会采取一毫秒或更多,但度量计算应该采取1微秒或更小。

总之,使用数据库表听起来像一个非常糟糕的主意给我。

下面是我建议:

table colors(color_id, color_name, r, g, b)

table color_distances(color_1_id, color_2_id, distance)

索引: PRIMARY(color_1_id,color_2_id) INDEX(color_1_id,距离,color_2_id)

color_distances将包含所有可能的COLOR_ID组合,并且将只根据需要更新。

选择随后将被简单:

SELECT similar_colors.*
FROM colors as similar_colors, color_distances
WHERE color_distances.color_1_id = <selected_color_id>
ORDER BY color_distances.distance ASC

我不是太熟悉,HCL,但颜色: :相似度:: HCL 的似乎两种颜色,需要作为用于距离输入

所以,我觉得至少两组RGB的和应该存储它们之间的距离,根据。我不知道你的使用情况,但如果选择的选择范围,你可能要存储用户选择为好。

似乎则仅可能组合的一个有限数量,但?好像你可以为每个组合做数学一次,只是有一个查找表?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top