(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 }
View Code

相关文章:

  • 2021-10-26
  • 2022-01-14
  • 2022-01-21
  • 2022-03-02
  • 2022-01-11
  • 2021-12-02
  • 2021-07-05
猜你喜欢
  • 2021-09-27
  • 2021-05-03
  • 2021-12-07
  • 2021-07-22
  • 2021-05-27
  • 2022-02-23
  • 2021-07-04
相关资源
相似解决方案