Этот вопрос был задан в ходе собеседования.
Предположим, вы хотите переехать, и у вас есть набор удобств, к которым вы хотите иметь легкий доступ из своего нового дома.Вы нашли окрестности, которые вам нравятся, каждый из которых имеет ноль или более удобств.Как бы вы выбрали такой блок, чтобы жить так, чтобы минимальное расстояние до любого объекта в вашем списке было минимальным?
Например, скажем, ваш список содержит {school, grocery}, а блоки следующие:
1: ресторан, продуктовый магазин
2: кинотеатр
3: школа
4:
5: школа
Идеальным выбором был бы блок 2, так что расстояния до продуктового магазина и ближайшей школы - 1 каждый.Проживание в блоке 1 или 3 приведет к тому, что одно из расстояний будет равно нулю, а другое - 2.
Я пришел к наивному решению, как показано в псевдокоде ниже:
max = minus infinity
min = plus infinity
for r in requirements:
for i in blocks:
for j in blocks:
if j.amenities contains r:
max = maximum {max, dist(i, j)}
if max < min:
live_at = i
Если n
- это количество блоков, сложность времени для этого алгоритма составляет O(n^2)
, если предположить, что список требований невелик по сравнению с n
.Можем ли мы сделать лучше?
Этот вопрос кажется похожим, хотя ответ мне не ясен.Это относится к бумаге, и начинается с «Нарисуйте круг в центре, с», без каких-либо указаний на то, что c
.