Question

J'ai une table "couleurs" dans ma base de données.

L'utilisateur entre une couleur cuvette de l'interface utilisateur, et les recherches de back-end pour la couleur à la recherche le plus similaire existant dans la table des couleurs, calcul de la distance des couleurs dans l'espace HCL.

Je vais mettre en œuvre un algorithme de mise en cache, qui devrait enregistrer la distance entre les distances de couleur calculées précédemment, afin d'éviter des opérations mathématiques répétées.

Quelle est la meilleure disposition de la table à cette fin?

Était-ce utile?

La solution

Comme Osama dit, cela ressemble à l'optimisation prématurée. D'après votre description de l'algorithme, je voudrais:

  • Pré-calcul des vecteurs HCL pour toutes les couleurs dans la base de données et stocker une table qui associe un identifiant de couleur à son vecteur HCL.
  • Le tableau doit être stocké en utilisant MySQL extensions spatiales , qui vous permettent d'interroger les voisins d'un point.
  • Quand une nouvelle couleur est choisie, le transformer pour HCL et requête pour les voisins de son point dans l'espace HCL.
  • Si la mise en cache est nécessaire à tous, je cache des couleurs à gros grains, donc il y a des chances que les utilisateurs revisitent une couleur sélectionnée précédemment.

Autres conseils

vous pouvez faire ceci:

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

, mais attendez-vous à vos utilisateurs de continuer d'entrer les mêmes chiffres ??? Le nombre maximum de lignes dans ce tableau est 16777216 si vous incluez seule la couleur la plus proche.

Je pense toujours que l'accès base de données est plus lente que le calcul, donc je pense à la citation « l'optimisation prématurée est la racine de tous les maux ».

Je courrais sans aucune mise en cache du calcul jusqu'à ce que je le vois comme un problème réel.

Je suppose que vos couleurs « distances » sont calculées comme quelque chose comme:

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

En supposant que vous utilisez 8 pixels de bits, il y aurait 256 (^ 3) ^ 2 correspondances distinctes dans votre table. C'est beaucoup d'espace de table. (Vous pourriez probablement compacter beaucoup, mais ... voir le point suivant).

L'autre chose que vous devez considérer est le coût d'une recherche de base de données pour trouver une distance de couleur par rapport au coût de faire le calcul. Je dirais qu'une recherche de base de données prendrait une milliseconde ou plus, mais le calcul métrique devrait prendre 1 microseconde ou moins.

Dans l'ensemble, à l'aide d'une table de base de données ressemble à une très mauvaise idée pour moi.

Voici ce que je recommande:

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

table color_distances(color_1_id, color_2_id, distance)

Indices: PRIMAIRE (color_1_id, color_2_id) INDEX (color_1_id, distance, color_2_id)

color_distances contiendraient toutes les combinaisons possibles color_id et ne seront mis à jour au besoin.

La sélection serait alors 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

Je ne suis pas trop familier avec HCL, mais basée sur la description Couleur: : Similitude :: HCL il semble que deux couleurs sont nécessaires en entrée pour la distance

.

Je pense donc au moins deux ensembles de RVB et la distance entre eux selon doivent être stockés. Je ne suis pas sûr de votre cas d'utilisation, mais si la gamme de choix est sélectionné, vous pouvez stocker la sélection de l'utilisateur ainsi.

Il semble qu'il n'y aurait qu'un nombre fini de combinaisons bien? Il semble que vous pouvez faire le calcul une fois pour chaque combinaison, et juste une table de consultation?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top