整数のみを取るダブルハッシュテーブルを書いています。
unsigned int DoubleHashTable::HashFunction1(unsigned int const data)
{
return (data % GetTableSize());
}
unsigned int DoubleHashTable::HashFunction2(unsigned int const data, unsigned int count)
{
return ((HashFunction1(data) + count * (5 - (data % 5)) % GetTableSize()));
}
SetData() を使用してテーブルにデータを挿入しようとしています
void DoubleHashTable::SetData(unsigned int const data)
{
unsigned int probe = HashFunction1(data);
if (m_table[probe].GetStatus())
{
unsigned int count = 1;
while (m_table[probe].GetStatus() && count <= GetTableSize())
{
probe = HashFunction2(data, count);
count++;
}
}
m_table[probe].Insert(data);
}
サイズが 100 のテーブルに 100 個の整数アイテムを配置した後、テーブルにはいくつかのインデックスが空白のままになっていることが示されます。最悪のケースであるO(N)がかかります。私の質問は、検索時間の最悪の場合でも、アイテムを空のスペースなしでテーブルに挿入する必要があるということですよね? 関数の問題が見つかりません。
追加の質問。ハッシュにはよく知られたアルゴリズムがあり、二重ハッシュの目的は可能な限り衝突を少なくすることであり、H2(T) は H1(T) のバックアップです。しかし、よく知られているハッシュ アルゴリズム (MD5、SHA など、セキュリティについては話していません。よく知られているアルゴリズムにすぎません) の方が高速で分散性が高いのであれば、なぜ二重ハッシュが必要なのですか?
ありがとう!