半径内の家を見つける


10

インタビュー中に、次のことを尋ねられました。特定の距離内(たとえば、ユーザーが20マイル以内にあるすべての家を検索したい場合など)に現在市場に出ている(つまり、販売中の)すべての家をリストする不動産アプリケーション。このタイプのサービスを構築するために、アプリケーション(データ構造とアルゴリズムの両方)をどのように設計しますか?

何か案は?どのように実装しますか?地理関連のことをしたことがないので知らないと言った。

回答:


6

彼らは言及答えの後におそらくある空間索引を選択することで、最も可能性の高い、箱から出して、空間インデックスを提供するデータベースを、しかし実装することにより、例えば、必要であれば、あなたもそれを言及することにより、いくつかのポイントは、アプリケーション自体に実装することができてしまうかもしれませんRを-Tree(DBの選択が他の理由で修正されている場合に便利かもしれませんが、空間データベースがどのように機能するかを知っていることも示します)。空間インデックスにより、検索ボックス内に収まる場所のサブセットをすばやく取得できます。実際の検索を行うには、実際の距離を計算することでさらに絞り込むことができます(必要に応じて、四角形だけで十分です)。円/楕円

距離がおそらく20M以下であることを考えると、20Mの終わりに向かって顕著なエラーが発生し始めますが、平坦な地球を距離の計算に使用すると想定できます。はるかに大きな範囲が正確に必要な場合は、より良い距離モデルの調査も開始する必要があります。地球のために、例えばハバシン距離

もちろん、UI設計、DBスキーマなど、議論できる他の無数の詳細もあります。これらは、それ自体が完全なトピックになる可能性があります。


20マイルでは、フラットアースモデルによる誤差は無視できます。とにかく、ユーザーが自分のオフィスから20マイル以内にある家のリストを表示したい場合、20マイルで10ヤード離れた家が結果に含まれているかどうかは気にしません。
ケビンクライン

1
実際、いくつかの誤検知が重要でない場合は、実際の距離の計算を完全にスキップして、MBR
jkを

私が気になる点の1つは、販売されている家の数が膨大であることを考えると、企業(Zilloなど)はすべてをdbに保存して、そこから選択し続けるのでしょうか。私はそれが大きなパフォーマンスヒットになると思います。それをすべてグラフ表現でメモリに格納する方がはるかに速くなるでしょう-多分行列または隣接リストで、距離アルゴリズムを使用して最も近い家を見つけます。どう思いますか?
ポールスミス

@paulsmithわかりませんが、空間DBにあると強く思います。空間DBはおそらく内部的にグラフ表現を使用するでしょう(おそらく、R-Treeについて説明しますが、他のオプションがあります)。そもそも最小外接長方形の項目のみを選択できます
jk。

8

このような質問に直面し、問題領域の専門知識がない場合は、いくつかのことを行うのが良いでしょう。

最初に、この問題領域に関する特定の専門知識がないことを認めてください。

次に、問題の解決方法を説明します。

私は地理的検索を扱う際に特定の経験はありませんが、問題を解決するための十分に文書化されたアルゴリズムと既存の技術があると確信しています。私はこれらを調査して、私が利用できる一般的なソリューションの知識を得て、プロジェクトの要件に基づいて実装について選択します。

3番目に、常にこのような問題を基本的なコンポーネントにまで減らします。マップ上の場所は2次元的に分散していることがわかります。任意のx、y座標が与えられた場合、別の座標からの各座標までの距離は、三角形を形成し、未知の長さを解くことによって計算されます。また、境界ボックス内のすべての座標を検索するように求められた場合は、検索するボックスの範囲を計算し、両方の軸に沿って単純な大なり小なりロジックを使用するだけでこれを実行できることもわかっています。

最後に、質問をあきらめそうな開発者を雇ったことがありません。私が質問をして、その人が「わからない」と言って、それを口頭で考えようとさえしなかった場合、彼らはブレインストーミングセッションに貢献しないという印象を与えます。これは、ソフトウェアを作成している組織では重要です。


すべての良いアドバイス
jk。

@ベン、私はあなたが言及したすべてのことには間違いなく同意しますが、面接官はセッションが始まる前に、あなたが知らないと言っても大丈夫だと明確に言ったので、私は彼の指示に従い、私が知らなかったことを前もって彼に話しました: )
ポール・スミス

4

これはおそらく明白ですが、多くのアプリケーションでは、貧しい人の遅い解決策が適切な場合があります。

緯度と経度を格納するリレーショナルデータベースにテーブルがある。緯度が20マイル以内、経度が20マイル以内のすべての場所をクエリします。これにより、実際に検索する半径を含む最小の境界長方形のサイズの境界長方形が得られます(地球の曲率も無視されます)。

次に、返されたセットを(インデックスを使用したクエリによって)取得し、距離の正確な計算を使用してフィルターで絞り込みます。

ですから、効率的なパフォーマンスではありませんが、開発の時間は非常に効率的です。多くのアプリケーションにとって、より良い選択かもしれません。


2

おそらく最も簡単な方法は、4Dツリーを使用して家の場所を格納することです。検索はかなり簡単でなければなりません。

GIS対応のRDBMSを使用してアイテムを格納している場合は、心配する必要はありません。リードプレーヤーのパフォーマンスに関する情報については、この質問を参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.