座標の大きなセットがあるとします
all_users = [{:user_id=>1,:x=>100,:y=>100}, {:user_id=>2,:x=>120,:y=>120}, ...]
ここにはいくつかの操作があります。
入れる
プレーヤーがオンラインになり、現在の座標を報告します
all_users << {:user_id=>3,:x=>150,:y=>150}
user_id で座標を更新
プレイヤーが新しい座標に移動します
user = all_users.detect {|u| u[:user_id] == current_user_id }
user.update :x => new_x, :y => new_y if user
user_id で削除
プレーヤーがログオフする
all_users.delete_if {|u| u[:user_id] == current_user_id }
座標範囲で検索
私の周りのユーザーを見つけて、+-100と言います。
all_users.select {|u| u[:user_id] != current_user_id && (u[:x] - me[:x]).abs <= 100 && (u[:y] - me[:y]).abs <= 100 }
ご覧のとおり、更新/削除/検索操作はすべて O(n) ですが、データベースと同様に、user_id & x & y の外部インデックスを設計することもオプションの 1 つかもしれません。他の考えはありますか?