найти дома в радиусе


10

Во время собеседования меня спросили, учитывая следующее: приложение для недвижимости, в котором перечислены все дома, которые в настоящее время находятся на рынке (например, продаются) на заданном расстоянии (например, пользователь хочет найти все дома в пределах 20 миль), Как бы вы разработали свое приложение (как структуру данных, так и логарифм) для создания этого типа сервиса?

Любые идеи? Как бы вы это реализовали? Я сказал ему, что не знаю, потому что раньше никогда не занимался гео-делами.

Ответы:


6

Они, вероятно, после ответа упоминают пространственную индексацию , скорее всего, выбирая базу данных, которая обеспечивает пространственную индексацию из коробки , но вы также можете получить несколько баллов, упомянув, что это может быть реализовано в самом приложении, если это необходимо, например, путем реализации R -Дерево (может быть удобно, если выбор БД фиксирован по другим причинам? Но также демонстрирует, как вы знаете, как работают пространственные базы данных). Пространственная индексация позволит вам быстро получить подмножество местоположений, которые помещаются в поле поиска, вы можете уточнить это далее, рассчитав фактическое расстояние (при необходимости, один прямоугольник может быть достаточно хорошим, конечно) для каждого, чтобы дать истинный поиск круг / эллипс

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

Есть также, конечно, множество других деталей, которые можно обсудить, например, дизайн пользовательского интерфейса, схема БД, которые могут быть целыми темами сами по себе.


На 20 милях ошибки из-за модели плоской земли будут незначительными. В любом случае, когда пользователь хочет увидеть список домов в пределах 20 миль от своего офиса, ему все равно, будет ли дом, который находится в 20 милях и 10 ярдах от него, включен в результаты.
Кевин Клайн

1
действительно, и если несколько ложных срабатываний не важны, то вы можете вообще пропустить расчет фактического расстояния и просто вернуть MBR
jk.

Одна вещь, которая меня интересует: учитывая огромное количество домов для продажи, хранят ли компании (например, Zillo?) Все это в БД и просто продолжают выбирать из них? Я полагаю, что это было бы огромным ударом по производительности, и было бы намного быстрее хранить все это в памяти с графическим представлением - возможно, матричным или смежным списком и использовать алгоритмы расстояния, чтобы найти ближайшие дома. Что вы думаете?
Пол Смит

@paulsmith Я не знаю, но я сильно подозреваю, что он находится в пространственной БД, пространственная БД, вероятно, все равно будет использовать графическое представление (скорее всего, R-Tree, как обсуждалось, но есть другие варианты), ключ находится в возможность выбирать только элементы в минимальном ограничительном прямоугольнике, в первую очередь
jk.

8

Всякий раз, когда вы сталкиваетесь с таким вопросом и у вас просто нет опыта в проблемной области, полезно сделать пару вещей.

Сначала подтвердите, что у вас нет специальных знаний в этой проблемной области.

Во-вторых , объясните, как вы решите проблему.

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

В-третьих , всегда сводите подобные проблемы к их основным компонентам. Вы знаете, что местоположения на карте распределены в двух измерениях. Вы знаете, что если вам заданы произвольные координаты x, y, расстояние до каждой координаты из другой координаты рассчитывается путем формирования треугольника и решения для неизвестной длины. Надеемся, вы также знаете, что если вас попросят найти все координаты внутри ограничительной рамки, вы можете сделать это, просто вычислив экстенты поля, которое вы хотите найти, и используя простую логику больше, меньше, чем по обеим осям.

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


все хорошие советы
JK.

@ Бен, я определенно согласен со всем, что вы упомянули, однако, поскольку интервьюер подробно сказал перед началом сессии, что можно сказать, что вы не знаете, я просто следовал его инструкциям и сказал ему заранее, что я не знаю: )
Пол Смит

4

Это, вероятно, очевидно, но для многих приложений медленное решение бедного человека может быть хорошим.

Имейте таблицу в реляционной базе данных, которая хранит широту и долготу. Запросите все местоположения, которые имеют широту в пределах 20 миль и долготу в пределах 20 миль. Это дает вам ограничивающий прямоугольник размером с наименьший ограничивающий прямоугольник, который содержит радиус, который вы действительно хотите найти (и игнорирует также кривизну Земли).

Затем вы берете набор, который возвращается (по запросу с использованием индексов), и фильтруете его, используя точный расчет расстояния.

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


2

Вероятно, самый простой способ - использовать квадри для хранения местоположений ваших домов, предполагая, что они распределены в 2D-ландшафте. Поиск должен быть довольно простым.

Если для хранения ваших вещей вы используете СУБД с поддержкой ГИС, вам не нужно об этом беспокоиться. Посмотрите этот вопрос для получения дополнительной информации о производительности ведущих игроков.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.