私は地図アプリケーションを作っています。私はたくさんの場所の座標を持っています。画面に表示されている領域内のすべてのポイントを返したい。これは、Google マップ API を使用して行います。画面に表示されている地図の北東と南西の座標が表示されます。MongoDb を使用しています。
明らかな方法は、ne-sw 対角線の中点を中心とし、いずれかの角からの距離を半径とし、その半径内のすべての点を見つけることです。
しかし、それらを単一のリストに格納するのは O(n) 操作になり、すべてのリクエストに対してスケーラブルではありません。ポイントをすぐに獲得できるように保管するには、どのような方法がよいでしょうか?
radius(r) 内のすべてのポイントを含むバケットに分割し、代わりにソートされたバケットのリストを維持することを考えています。画面は最大で 4 つのバケット (個別のバケットのすべてのコーナー) に配置できるため、O(log n) で最も近いバケットを見つけ、O(1) で次の 3 つの最も近いバケットを見つけます。ここで、これら 4 つのバケットに対してのみ計算を行う必要があります。
しかし、それはまだたくさんのバケツです! Google は、マップ上のポイントを非常に迅速にレンダリングできます。そして、彼らはたくさんのポイントを持っています。そしてたくさんのユーザー。彼らはそれをどのように管理していますか?そのレベルの最適化に達するとは思っていませんが、より良いデータ構造が必要です。