Pregunta

Tengo una tabla "colores" en mi base de datos.

El usuario introduce un color A través del interfaz de usuario y las búsquedas de back-end para el color de aspecto más similar existente en la tabla de colores, el cálculo de la distancia de los colores en el espacio de HCL.

Voy a implementar un algoritmo de caché, que debe guardar la distancia entre las distancias de color calculados previamente, para evitar repetidas operaciones matemáticas.

¿Cuál es el mejor diseño de la mesa para tal fin?

¿Fue útil?

Solución

Como dijo Osama, esto se parece a la optimización prematura. Basado en su descripción del algoritmo, lo haría:

  • Pre-cálculo de los vectores de HCL para todos los colores en la base de datos, y almacenar una tabla que asigna un identificador de color a su vector de HCL.
  • La tabla debe ser almacenado utilizando la espaciales de MySQL Extensiones , que permiten consultar a los vecinos de un punto.
  • Cuando se elige un nuevo color, transformarlo a HCL, y consulta a los vecinos de su punto en el espacio HCL.
  • Si se necesita el almacenamiento en caché en absoluto, sería caché colores de grano grueso, por lo que hay alguna posibilidad de que los usuarios vuelven a visitar un color seleccionado previamente.

Otros consejos

usted puede hacer esto:

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

pero qué se puede esperar de sus usuarios para mantener introducir los mismos números ??? El número máximo de filas en esta tabla es 16777216 si se incluye sólo el color más cercano.

Todavía sospecho que el acceso a la base de datos es más lento que el cálculo, así que estoy pensando en la cita " optimización prematura es la raíz de todo mal ".

Me ejecutarlo sin ningún tipo de almacenamiento en caché del cálculo hasta que lo vea como un problema real.

Asumo que sus colores "distancias" se calculan como algo parecido a:

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

Si se asume que está utilizando 8 bits píxeles, no habría (256 ^ 3) ^ 2 asignaciones distintas en su mesa. Eso es un montón de espacio de tabla. (Probablemente se podría compactar mucho, pero ... ver el siguiente punto).

La otra cosa que hay que considerar es el costo de una consulta de base de datos para encontrar una distancia de color en comparación con el costo de hacer el cálculo. Mi conjetura sería que una búsqueda de base de datos tomaría una milésima de segundo o más, pero el cálculo de la métrica debe tomar de 1 microsegundo o menos.

Con todo, el uso de una tabla de base suena como una muy mala idea.

Esto es lo que recomiendo:

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

table color_distances(color_1_id, color_2_id, distance)

Índices: PRIMARIA (color_1_id, color_2_id) ÍNDICE (color_1_id, distancia, color_2_id)

color_distances contendrían todas las combinaciones posibles color_id, y sólo se actualizará cuando sea necesario.

Selección sería entonces simple:

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

No estoy muy familiarizado con HCL, pero en base a la descripción en Color: : Similitud :: HCL parece que se necesitan dos colores como una entrada para la distancia

.

Así que yo creo que al menos dos conjuntos de RGB y la distancia entre ellos de acuerdo debe ser almacenado. No estoy seguro de su caso de uso, pero si se selecciona la gama de opciones, es posible que desee almacenar la selección del usuario también.

Parece que sólo habría un número finito de combinaciones sin embargo? Parece que usted podría hacer los cálculos una vez para cada combinación, y sólo tienen una tabla de búsqueda?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top