знаходження будинків в радіусі


10

Під час інтерв'ю мене попросили наступне: Додаток про нерухомість, який перераховує всі будинки, які зараз є на ринку (тобто для продажу) в межах певної відстані (скажімо, наприклад, користувач хоче знайти всі будинки в межах 20 миль), як би ви створили свою програму (як структуру даних, так і алогіритм) для створення такого типу послуг?

Будь-які ідеї? Як би ти це реалізував? Я сказав йому, що не знаю, що раніше я ніколи не робив жодного гео-пов'язаного матеріалу.

Відповіді:


6

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

Зважаючи на те, що відстані, ймовірно, 20 М або менше, ви, мабуть, гаразд, припускаючи плоску землю для обчислення відстані, хоча ви почнете помічати помітні помилки до кінця 20М, якщо потрібні набагато більші діапазони, вам також знадобиться почати дивитися на кращі моделі відстаней для земної кулі, наприклад, відстань Гаверсіна

Є, звичайно, ще безліч інших деталей, про які можна було б обговорити, наприклад, дизайн інтерфейсу, схема БД, яка сама по собі може бути цілою темою.


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

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

Мені цікаво одне: враховуючи величезну кількість будинків для продажу, чи компанії (наприклад, Zillo, можливо?) Зберігають все це в db і просто продовжують їх вибирати? Я думаю, що це буде величезний показник продуктивності, і було б набагато швидше зберегти все це в пам'яті з графічним поданням - можливо, матрицею або списком суміжності та використовувати алгоритми відстаней для пошуку найближчих будинків. Як ти гадаєш?
Пол Сміт

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

8

Щоразу, коли ви стикаєтесь з таким питанням, і у вас просто немає досвіду в проблемній області, добре робити пару речей.

Спершу визнай, що ти не маєш конкретних знань у цій проблемній галузі.

По-друге , поясніть, як би ви вирішили проблему.

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

По-третє , Завжди зводити подібні проблеми до основних компонентів. Ви знаєте, що розташування на карті розподілено в двовимірному масштабі. Ви знаєте, що якщо вам задано довільну x, y координати відстань до кожної координати від іншої координати обчислюється, утворюючи трикутник і розв’язуючи невідому довжину. Сподіваємось, ви також знаєте, що якщо вас попросять знайти всі координати в обмежувальному полі, ви можете це зробити, просто обчисливши розширення вікна, яке ви хочете знайти, і використовуючи прості, більші, менші за логіку вздовж обох осей.

Останнє , я ніколи не найняв розробника , який , здавалося, відмовитися від питань. Якщо я задаю запитання, а людина каже "я не знаю" і навіть не намагається продумати його усно, це створює враження, що вони не сприятимуть сеансам мозкових штурмів - що критично важливо в організаціях, які пишуть програмне забезпечення .


всі добрі поради
jk.

@Ben, я безумовно погоджуюся з усіма згаданими вами речами, однак, оскільки інтерв'юер чітко сказав перед початком сесії, що добре сказати, що ви не знаєте, я просто дотримувався його вказівок і сказав йому вперед, що я не знаю: )
Пауль Сміт

4

Це, мабуть, очевидно, але для багатьох застосувань повільне рішення бідолахи може бути нормальним.

Майте таблицю у реляційній базі даних, яка зберігає широту та довготу. Запит на всі локації, які мають широту в межах 20 миль і довготу в межах 20 миль. Це дає вам обмежуючий прямокутник розміром найменшого обмежуючого прямокутника, який містить радіус, який ви дійсно хочете шукати (а також ігнорує кривизну землі).

Потім ви берете набір, який повертається (за допомогою запиту за допомогою індексів), і відфільтровуєте його за допомогою точного розрахунку відстані.

Отже, неефективна робота, але дуже ефективна в часі, щоб розвиватися. Для багатьох програм, які можуть бути кращим вибором.


2

Ймовірно, найпростішим способом є використання квадрату для зберігання місць ваших будинків, припускаючи, що вони розподілені у двовимірному пейзажі. Пошук повинен бути досить простим.

Якщо ви використовуєте RDBMS з підтримкою ГІС для зберігання своїх речей, то вам справді не потрібно турбуватися про це. Дивіться це запитання для отримання деякої інформації про продуктивність головних гравців.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.