この問題はハッシュで解決できるとは思いません。ここに難点があります: 赤いピクセルがあり、3 と 5 を同じ値にハッシュしたいとします。では、5 と 7 を同じ値にハッシュし、7 と 9 なども同様に... すべてのピクセルを同じ値にハッシュするチェーンを作成できます。
代わりに私が試すことは次のとおりです。
- すべてのイメージを含む、各ノードに 32 方向のファンアウトを持つ巨大な B ツリーを構築します。
- ツリー内のすべての画像が同じサイズであるか、重複していません。
- 色付きの各ピクセルにゼロから始まる一意の番号を付けます。左上には、R、G、B コンポーネントの 0、1、2 の番号が付けられている場合があります。または、その番号順に画像を比較するため、ランダムな順列を使用したほうがよい場合があります。
- 深さ n の内部ノードは、ピクセル n を 8 で割った値を 32 通りに識別します (これにより、近くのピクセルのノイズの一部が取り除かれます。
- リーフ ノードには、10 から 100 などの少数の画像が含まれます。または、画像の数は深さの増加関数であるため、1 つの画像の複製が 500 ある場合、特定の深さの後にそれらを区別しようとするのをやめます。 .
200 万のノードすべてがツリーに挿入され、2 つのイメージは同じノードにある場合にのみ複製されます。右?違う!2 つの画像のピクセル値が 127 と 128 の場合、一方は外端 15 に入り、もう一方は外端 16 に入ります。したがって、実際にピクセルで区別する場合、その画像を 1 つまたは 2つの子に挿入できます。
- 明るさについては、 、、および を
B
挿入します。3 つすべてが等しい場合もあれば、常に 3 つのうち 2 つが等しい場合もあります。しかし、3/8 の確率で、画像が現れるアウトエッジの数を 2 倍にします。物事がどれだけ深くなるかに応じて、多くの余分なノードを持つことができます。 B/8
(B-3)/8
(B+3)/8
他の誰かが計算を行い、画像が重複しすぎないように 8 より大きい値で割る必要があるかどうかを確認する必要があります。良いニュースは、真のファンアウトが 32 ではなく約 4 であっても、必要なのは深さ 10 のツリーだけです。自由に使える十分な RAM があることを願っています。そうでない場合は、ツリーをファイルシステムに配置できます。
これがどうなるか教えてください!