0

2 つ以上のハッシュテーブルを一緒にマージしたい..繰り返し処理できる限り、最終的な形式が何であるかは問題ではありません。ここで、最終的な形式は配列です。

したがって、キーとして unsigned long long があり、値は string,int のペアです。各キーはビンにマップされ、各ビンは衝突を持つことができます。ハッシュテーブル全体を配列にコピーする代わりに、ビンごとにコピーします。そうすれば、配列全体を反復処理する必要がなくなります。最初に、最初のハッシュテーブルの最初のビンをペアの配列にコピーします。文字列と int をフィールドとして使用します (キーは無視されます)。

何かのようなもの

Class Pair{
char* s;
int frequency;
};

それを配列に追加するには、次のようなものがあります...

Pair pair
pair.s=string of the hashtable value
pair.s=integer of the hashtable value
array[index]=pair;

次に、2 番目のハッシュテーブルの 1 番目のビンを配列にマージするために、最初にハッシュテーブルの値の文字列が既に配列にあるかどうかを確認します。存在する場合は、その文字列に対応するクラス ペアの int 部分を更新します。そうでない場合は、配列に追加します。

次に、次のビンに進みます。最初のハッシュテーブルの 2 番目のビンを配列にコピーします。次に、配列全体を反復処理して、2 番目のハッシュテーブルの 2 番目のビンの何かが配列内にあるかどうかを確認する代わりに、検索を開始します。 2 番目のビンの最初の要素が配列に挿入された配列インデックスから。

問題は、各ビンに1000以上の衝突が含まれる可能性があり、通過するビンが数千あるため、その方法を繰り返すことはまだかなり長いことです.私はそれを避けたい. 各キー (long long) は各文字列で一意であるため、そのキー番号のオフセットを配列内にある場合は 1 に、そうでない場合は 0 に設定することを考えていました。そうすれば、配列内にある場合にのみ配列を反復処理する必要があります。それに関する問題は、長い長いということです。単に大きすぎます。その多くのビットで配列を割り当てることはできません...

別の方法はありますか?

4

1 に答える 1

0

最初のハッシュ テーブルから値をコピーするときに、同じキーを使用して一時的なハッシュ テーブルを作成しますが、値はそれぞれが挿入された配列インデックスになります。次に、2 番目のハッシュ テーブルから値をコピーするときに、各キーが一時テーブルにあるかどうかを確認します。そうである場合は、更新する配列要素がすぐにわかります (そうでない場合は、最後に新しい値をプッシュするだけです)。

より少ないスペースを使用するが入力を変更する別のアプローチは、2 番目のハッシュ テーブルを最初のハッシュ テーブルにコピーしてから、その組み合わせた結果を配列にコピーすることです。これにより、追加のストレージなしで 2 つのハッシュ テーブルが自然にマージされますが、プログラムの実行でハッシュ テーブルがさらに使用される場合は、あまり効果的ではない可能性があります。

于 2011-05-07T17:30:38.997 に答える