(1)冲突处理方法为:顺次循环后移到下一个位置,寻找空位插入。
(2)BKDE 字符串哈希
unsigned int hash_BKDE(char *str)
{
/* 初始种子seed 可取31 131 1313 13131 131313 etc.. */
unsigned int seed = 131;
unsigned int hash = 0;
while (*str)
{
hash = hash * seed + (*str++);
}
return (hash & 0x7FFFFFFF);
}
选做内容
每一种西文图书都有一个国际标准图书编号,它是一个10位的十进制数字,若要以它作关键字建立一个哈希表,当馆藏书种类不到10,000时,采用折叠法构造一个四位数的哈希函数。
1 #include<iostream> 2 #include<string> 3 #include<string.h> 4 #include<stdlib.h> 5 6 #define Datatype string 7 #define max 5000 8 using namespace std; 9 10 11 typedef struct 12 { 13 Datatype data; 14 bool isnull; 15 }Hash; 16 Hash hashTable[max]; 17 18 void initHash() 19 { 20 21 for(int i=0;i<max;i++) 22 { 23 hashTable[i].isnull=0; 24 } 25 cout<<"call initHash( )\n"<<endl; 26 27 } 28 unsigned int hash_B(char *str) 29 { 30 /**初始种子seed**/ 31 unsigned int seed=131; 32 unsigned int hash=0; 33 34 while(*str) 35 { 36 hash=hash*seed+(*str++); 37 } 38 39 return (hash&&0x7fffffff); 40 } 41 int insertHash(string str) 42 { 43 char ch[100]; 44 int index; 45 strcpy(ch,str.c_str()); 46 index=hash_B(ch); 47 48 if(hashTable[index].isnull == 0) //没有发生冲突 49 { 50 hashTable[index].data = ch; 51 hashTable[index].isnull = 1; 52 53 } 54 else //当发生冲突的时候 55 { 56 while(hashTable[index].isnull == 1 && index<max) 57 { 58 index++; //采用线性探测法,步长为1 59 } 60 if(index == max) //Hash表发生溢出 61 return -1; 62 hashTable[index].data = ch; 63 hashTable[index].isnull = 1; 64 65 } 66 // cout<<"index: "<<index<<endl; 67 return 0; 68 //hashTable[index].data=ch; 69 //hashTable[index].isnull=1; 70 } 71 72 bool findHash(string str) 73 { 74 75 char ch[100]; 76 int index,i; 77 strcpy(ch,str.c_str()); 78 index=hash_B(ch); 79 bool flag=0; 80 81 for(i=index;i<max;i++) 82 { 83 if(hashTable[i].isnull==0) 84 {flag=0;break;} 85 if(str==hashTable[i].data) 86 {flag=1;break;} 87 } 88 89 90 return flag; 91 92 } 93 int main() 94 { 95 initHash(); 96 int n,m,i,j; 97 cout<<"输入:"<<endl; 98 cin>>n; 99 string str; 100 for(i=0;i<n;i++) 101 { 102 cin>>str; 103 if(insertHash(str)<0) 104 {cout<<"溢出"<<endl;break;} 105 } 106 cin>>m; 107 bool e[m]; 108 for(i=0,j=0;i<m;i++,j++) 109 { 110 cin>>str; 111 if(findHash(str)) 112 e[j]=1; 113 else 114 e[j]=0; 115 } 116 for(j=0;j<m;j++) 117 { 118 if(e[j]) 119 cout<<"yes"<<endl; 120 else 121 cout<<"no"<<endl; 122 } 123 cin>>n; 124 return 0; 125 }