哈希碰撞/哈希衝突:不同的Key值經過哈希函數Hash(Key)處理以後可能產生相同的值哈希地址,我們稱這種情況爲哈希衝突。任意的散列函數都不能避免產生衝突。
#include<iostream>
#include<vector>
using namespace std;
enum State
{
EMPTY,
DELETE,
EXIST,
};
class HashTable
{
public:
HashTable(int capacity)
{
v.reserve(capacity);
v.assign(capacity, 0);
s.reserve(capacity);
s.assign(capacity, EMPTY);
_size = 0;
}
//閉散列法——線性探測
void Insert1(int x)
{
int pos = x % v.capacity();
while (s[pos] == EXIST)
{
if (v[pos] == x)
{
return;
}
pos++;
if (pos == v.capacity())
{
pos = 0;
}
}
s[pos] = EXIST;
v[pos] = x;
++_size;
}
//閉散列法——二次探測
int Curpos(int Lastpos, int i,int capacity)
{
return (Lastpos + 2 * i - 1) % capacity;
}
void Insert2(int x)
{
_CreatExpand();
int i = 0;
int pos = x%v.capacity();
while (s[pos] == EXIST)
{
if (v[pos] == x)
{
return;
}
pos = Curpos(pos, ++i,v.capacity());
}
s[pos] = EXIST;
v[pos] = x;
++_size;
}
void Print()
{
for (int i = 0; i < v.capacity(); i++)
{
printf("【%d, %d】\t", v[i], s[i]);
}
cout << endl;
}
protected:
void _CreatExpand()
{
if (_size >= (int)(v.capacity()*0.7))
{
vector<int>v1;
v1.reserve(2 * v.capacity());
v1.assign(v1.capacity(), 0);
vector<State>s1;
s1.reserve(2 * s.capacity());
s1.assign(s1.capacity(), EMPTY);
for (int i = 0; i < (int)v.capacity(); i++)
{
if (s[i] == EXIST)
{
int k = 0;//第幾次哈希衝突
int pos = v[i] % v1.capacity();
while (s1[pos] == EXIST)
{
pos = Curpos(pos, ++k, v1.capacity());
}
s1[pos] = EXIST;
v1[pos] = v[i];
}
}
v.swap(v1);
s.swap(s1);
_size = v.size();
}
}
private:
vector<int>v;
vector<State>s;
int _size;
};</span>