一般的な問題: ドットがまばらに配置された大きな 2 次元ポイント空間があります。黒い点がちりばめられた大きな白いキャンバスと考えてください。これらのドットを何度も繰り返して検索する必要があります。キャンバス (ポイント スペース) は、int の制限に接する巨大なサイズになる可能性があり、そこにポイントを設定する前にそのサイズは不明です。
それはハッシュのアイデアに私をもたらしました:
理想: 2D ポイントを取り、一意の uint32 を返すハッシュ関数が必要です。衝突が起こらないように。Canvas 上のドットの数は、uint32 で簡単に数えられると想定できます。
重要:キャンバスのサイズを事前に知ることは不可能です (変更される場合もあります)。
キャンバス幅 * y + x
悲しいことに問題外です。
私も非常に素朴なことを試しました
abs(x) + abs(y)
しかし、それでは衝突が多すぎます。
妥協:衝突の可能性が非常に低い キーを提供するハッシュ関数。
アイデアはありますか?助けてくれてありがとう。
よろしく、 アンドレアス T.
編集:質問テキストで何かを変更する必要がありました:「uint32でキャンバスのポイント数をカウントできる」という仮定を「キャンバス上のドットをカウントできる(または保存する座標ペアの数)」に変更しましたsqrt(max(uint32))xsqrt(max(uint32)) サイズのキャンバスがあり、16 ビット シフトと OR で一意に表現できるため、元の質問はあまり意味がありませんでした。
すべての答えは、更新された仮定で最も理にかなっているので、これで問題ないことを願っています
そのために残念。