-3

短いバージョン - 文字列と、文字列を配置するバケットを返すバケットの数を表す整数を指定する Java アルゴリズムを探しています。

長いバージョン - 多数のオブジェクトを均等に (またはほぼ均等に) ビンに分散する必要があります。ビン/バケットの数はさまざまであるため、アルゴリズムは特定の数のビンを想定できません。1、30、または 200 のいずれかです。これらのオブジェクトのキーは文字列になります。

文字列には、予測可能な重要な特性がいくつかあります。文字列の最初の 2 文字は、実際にはバイトの 16 進数表現のように見えます。つまり 00-ff であり、文字列自体はその範囲内で非常に均等に分散されています。ただし、異なる方法で始まる外れ値がいくつかあるため、これを 100% 信頼することはできません (ただし、99.999% は簡単に信頼できます)。これは、エッジ ケースを処理する必要があることを意味します。

すべての文字列が分散されたら、任意の 2 つのビンに表示される値の間で範囲が重複しないようにすることが重要です。したがって、ビンに表示される値の範囲がわかっている場合は、オブジェクトを見つけるために他のビンを調べる必要はありません。たとえば、2 つのビンがある場合、ビン 0 には文字 am で始まる文字列があり、ビン 1 には nz で始まる文字列がある可能性があります。ただし、文字列について知っていることを考えると、それは均一な分散の必要性を満たさないでしょう。

最後に、実装はビンの現在の状態を認識できません。メソッドのシグネチャは文字通り次のようになります。

public int defineBucketIndex(String key, int numBuckets);

Strings の配布に関する予知は十分であると考えています。

編集: いくつかの質問の明確化 バケットの数は256 を超える可能性があります。文字列には最初の 2 の後に追加の文字が含まれているため、これを活用できます。

バケットは、後で高速に検索できるように、一連の文字列を保持する必要があります。実際、それが最初からビニングされている理由です。範囲の知識だけで、正確に 1 つのバケットを調べて、値が存在するかどうかを確認できるはずです。他人に目を向ける必要はありません。

ハッシュコードは機能しません。特定の範囲の文字列値 (ハッシュではなく) 内の文字列のみを含むバケットが必要です。ハッシュはそれを失うでしょう。

編集 2: どうやらうまく通信していません。ビンが選択されると、これらの値がファイルに書き出されます。ビンごとに 1 ファイル。ビニング後にこれらのファイルを使用するシステムは Java ではありません。既に実装されており、範囲内に収まるビンの値が必要です。繰り返しますが、ハッシュコードは機能しません。文字列の範囲が2つのビン間で重複することはできず、ハッシュコードを使用しても機能しないと明示的に述べました。

4

3 に答える 3

0

説明されているように、問題が完全に解決できるかどうかは真剣に疑問です。これはどう:

  1. 257 個のビンを作成します。
  2. すべての通常の文字列をビン 0 ~ 255 に入れます。
  3. すべての外れ値をビン 256 に入れます。

「均等配分」以外は、これですべての要件を満たしているのではないでしょうか。

この時点で、より均一な分散が本当に必要な場合は、ビン 0 ~ 255 をより少数のより均一に分散されたビンに再編成できます。しかし、そこの要件を緩和する必要があるかもしれないと思います。

于 2013-09-15T18:41:42.443 に答える
0

元の投稿への2回の更新後に回答が編集されました

最初から質問にすべての情報を含めることは優れたアイデアでした-新しい編集により、説明はすでに答えを提供しています:バランスの取れたツリーにオブジェクトを貼り付けます(必要な均一な分布を提供します)文字列の hashCodesubstring(0,2)または同様のヘッドベースのものに基づいています。次に、BTree の各リーフ (文字列のセット) をファイルに書き込みます。

于 2013-09-15T17:42:23.893 に答える