2016-04-08 6 views
0

およびC++でのアルゴリズム分析:再ハッシュを行う最も簡単な方法は何ですか?マーク・ワイスのデータ構造から

/** 
* Rehashing for quadratic probing hash table. 
*/ 
void rehash() 
{ 
    vector<HashEntry> oldArray = array; 

    // Create new double-sized, empty table 
    array.resize(nextPrime(2 * oldArray.size())); 
    for(auto & entry : array) 
     entry.info = EMPTY; 

    // Copy table over 
    currentSize = 0; 
    for(auto & entry : oldArray) 
     if(entry.info == ACTIVE) 
      insert(std::move(entry.element)); 
} 

それは表にておきの要素を移動すること、及び要素がアクティブであるかどうかをチェックするかの本当に痛みを伴う操作のように思えますない。特に、(テーブル全体とは対照的に)挿入された要素の数だけを通すことを意味する実装がありますか?

+1

リンクされたハッシュ構造(エントリが二重リンクリストとしても接続されている)を使用すると、テーブル全体ではなく要素を直接トラバースすることができます(任意の順序ではなく、挿入順序でテーブルを反復できます) )。それは働くだろうか? – ShadowRanger

+0

閉鎖されたハッシュシナリオ(私の目標)でこれが機能しますか?参照:Open Hashing(Separate Chaining):オープンハッシュでは、キーはハッシュテーブルのセルにアタッチされたリンクリストに格納されます。 閉じたハッシュ(公開アドレス指定):閉じたハッシュでは、すべてのキーはリンクリストを使用せずにハッシュテーブル自体に保存されます。 – blueman

+2

挿入された要素の数がテーブルのサイズの少なくとも半分であるときに再ハッシュする必要があるため、すべての表のセルをチェックするのに費用がかかりません。 –

答えて

0

参照、Per-Ake Larson、ダイナミックハッシング、 CACM April 1988、pp 446-457を参照してください。彼は、バケットを分割し、スプレットバケットのハッシュコードだけを再計算する必要があるハッシュシステムについて説明します。

'C' version of it coded as an hsearch(3) replacementは、1998年7月のUsenet comp.sources.miscアーカイブに[email protected](me)が寄稿しています。このコードは、その後、Berkeley DBやOpenLDAPをはじめとするさまざまな場所への道を開いた。申し訳ありませんが、元のソースコードはまだありませんが、私はJavaの実装があります。

+0

オープンハッシュを使用していませんか(たとえば、 'p =&q-> Next;')?クローズドハッシュ(*「2次プロービングハッシュテーブルのリハッシュ」*)に関する問題は、技術が全く異なるためです。 –

関連する問題