字典问题,根据输入的外文查找字典中对应的英文。用HASH做。
1.做完发现超时,仔细审查发现HASH函数写的很不好,虽然hash表长度很长,但是计算出的结果集中在一个区间内,分布十分不均匀。上网上找了一些专门处理字符串的hash函数,替换后效果好很多,顺利通过。
hash函数
//用跟元素个数最接近的质数作为散列表的大小 #define NHASH 29989 #define MULT 31 unsigned in hash(char *p) { unsigned int h = 0; for (; *p; p++) h = MULT *h + *p; return h % NHASH; }
#include<iostream>
using namespace std;
#define LEN 100003
struct node
{
char English[11];
char Forgien[11];
node * next;
};
node dictionary[100000];
node *HashTable[LEN];
char w[11];
char input[100000][11];
unsigned int Hash(char *s);
void search(char *s);
int main()
{
int i;
int n=0;
int m=0;
unsigned int addr;
char input[11];
char t;
node *p;
while(gets(w)&&w[0]!='\0')
{
sscanf(w,"%s %s",dictionary[n].English,dictionary[n].Forgien);
addr=Hash(dictionary[n].Forgien);
if(!HashTable[addr])
HashTable[addr]=&dictionary[n];
else
{
p=HashTable[addr];
while(p->next)
p=p->next;
p->next=&dictionary[n];
}
n++;
}
while(cin>>input)
{
search(input);
}
return 0;
}
unsigned int Hash(char *s)
{
unsigned int h=0;
for(;*s;s++)
h=31*h+*s;
return h%LEN;
}
void search(char *s)
{
unsigned int addr;
node *p;
addr=Hash(s);
p=HashTable[addr];
while(p)
{
if(0==strcmp(p->Forgien,s))
{
cout<<p->English<<endl;
return;
}
else
p=p->next;
}
cout<<"eh"<<endl;
}