1、使用分离链接法避免collision
参考代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class node
{
public:
string word;
int count;
node * next;
};
node * hashTable[700]={};
void init()
{
int i;
for(i=0;i<700;i++)
{
hashTable[i] = new node;
hashTable[i]->next=NULL;
}
}
void insert(string s)
{
const char *t =s.c_str();
int i=0;
int num=0;
while(i<5 && (*t)!='\0')
{
num+=*t;
t++;
i++;
}
node *head = hashTable[num];
while(head->next!=NULL)
{
if(head->next->word == s)
{
head->next->count++;
return ;
}
else
head=head->next;
}
if(head->next == NULL)
{
node *tail = new node;
tail->count=1;
tail->word=s;
tail->next=NULL;
head->next=tail;
}
return ;
}
int find(string s)
{
const char *t =s.c_str();
int i=0;
int num=0;
while(i<5 && (*t)!='\0')
{
num+=*t;
t++;
i++;
}
node *head = hashTable[num];
while(head->next!=NULL)
{
if(head->next->word == s)
{
return head->next->count;
}
else
head=head->next;
}
if(head->next ==NULL)
return 0;
}
int main()
{
init();
int i;
for(i=0;i<10;i++)
{
string w;
cin>>w;
insert(w);
}
string w("hello");
cout<<find(w);
return 0;
}
采用开放定址法-》线性探测:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class node
{
public:
string word;
int count;
};
node hashTable[700];
void init()
{
int i;
for(i=0;i<700;i++)
{
hashTable[i].word = string("1");
hashTable[i].count = 0;
}
}
void insert(string s)
{
const char *t =s.c_str();
int i=0;
int num=0;
while(i<5 && (*t)!='\0')
{
num+=*t;
t++;
i++;
}
while(hashTable[num].word !=string("1"))
{
if(hashTable[num].word == s)
{
hashTable[num].count++;
return;
}
else
num++;
}
hashTable[num].word=s;
hashTable[num].count++;
return ;
}
int find(string s)
{
const char *t =s.c_str();
int i=0;
int num=0;
while(i<5 && (*t)!='\0')
{
num+=*t;
t++;
i++;
}
while(hashTable[num].word !=string("1"))
{
if(hashTable[num].word == s)
{
return hashTable[num].count;
}
else
num++;
}
return 0;
}
int main()
{
init();
int i;
for(i=0;i<10;i++)
{
string w;
cin>>w;
insert(w);
}
string w("hello");
cout<<find(w);
return 0;
}