および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));
}
それは表にておきの要素を移動すること、及び要素がアクティブであるかどうかをチェックするかの本当に痛みを伴う操作のように思えますない。特に、(テーブル全体とは対照的に)挿入された要素の数だけを通すことを意味する実装がありますか?
リンクされたハッシュ構造(エントリが二重リンクリストとしても接続されている)を使用すると、テーブル全体ではなく要素を直接トラバースすることができます(任意の順序ではなく、挿入順序でテーブルを反復できます) )。それは働くだろうか? – ShadowRanger
閉鎖されたハッシュシナリオ(私の目標)でこれが機能しますか?参照:Open Hashing(Separate Chaining):オープンハッシュでは、キーはハッシュテーブルのセルにアタッチされたリンクリストに格納されます。 閉じたハッシュ(公開アドレス指定):閉じたハッシュでは、すべてのキーはリンクリストを使用せずにハッシュテーブル自体に保存されます。 – blueman
挿入された要素の数がテーブルのサイズの少なくとも半分であるときに再ハッシュする必要があるため、すべての表のセルをチェックするのに費用がかかりません。 –