Вопрос

У меня есть таблица «цветов» в моей базе данных.

Пользователь вводит цвет через пользовательский интерфейс, а серверная часть ищет наиболее похожий цвет, существующий в таблице цветов, вычисляя расстояние между цветами в пространстве HCL.

Я реализую алгоритм кэширования, который должен хранить расстояние между ранее вычисленными цветовыми расстояниями, чтобы избежать повторных математических операций.

Какая раскладка стола лучше всего подходит для этой цели?

Это было полезно?

Решение

Как сказал Усама, это выглядит как преждевременная оптимизация.Основываясь на вашем описании алгоритма, я бы:

  • Предварительно рассчитайте векторы HCL для всех цветов в базе данных и сохраните таблицу, которая сопоставляет идентификатор цвета с его вектором 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)

Индексы:Первичный (Color_1_id, Color_2_id) Индекс (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