Я был на собеседовании, и меня попросили создать эффективный алгоритм для решения следующей задачи:
Ввод:
У нас есть список цветов RGB.Каждый цвет представлен 3 координатами <x,y,z>
от 0 до 255. Этот список никогда не меняется.
Мы получаем каждый раз какой-то дополнительный цвет ( не обязательно из списка выше), и нам нужновернуть ближайший (по расстоянию) цвет из списка к дополнительному цвету.
Примечания:
Мы можем выполнить некоторую предварительную обработку списка цветов, поскольку список никогда не меняется.
Расстояние между цветами, определенное как: 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>
.
Моя попытка решить эту проблему:
Очевидно, что мы можем выполнить предварительную обработку и сохранить все цветовые пары в мире, а также сохранить расстояние, и мы можем получить решение за время выполнения O (1), но с огромнымпамять (255^3*n)
Самым наивным решением является циклическое перемещение по списку и вычисление расстояния между каждым цветом из списка до дополнительного цвета и возврат цвета с минимальным расстоянием,Это берет O(n)
, где n - длина списка цветов.
Я пытался, возможно, сделать какую-то сортировку списка с координатами x, y, z и сохранить 3 отсортированного списка илиСортировка по расстоянию до <0,0,0>
, но я понятия не имею, как продолжить это.
Я также видел это , но вопрос не в алгоритмическом подходе к проблеме.