hash表的建立和查找

Posted 天气晚来秋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hash表的建立和查找相关的知识,希望对你有一定的参考价值。

 

(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

 

  1 #include<iostream>
  2 #include<string>
  3 #include<string.h>
  4 #include<stdlib.h>
  5 
  6 #define Datatype string
  7 #define max 10000
  8 #define length 10
  9 #define adr 4
 10 using namespace std;
 11 
 12 
 13 typedef struct
 14 {
 15     Datatype data;
 16     bool isnull;
 17 }Hash;
 18 Hash hashTable[max];
 19 
 20 void initHash()
 21 {
 22 
 23     for(int i=0;i<max;i++)
 24     {
 25         hashTable[i].isnull=0;
 26     }
 27     cout<<"call initHash( )\\n"<<endl;
 28 
 29 }
 30 unsigned int hash_B(char *str)
 31 {
 32     int i,j;
 33     int bit[length];
 34     for(i=0;i<length;i++)
 35     {
 36         bit[i]=str[i]-\'0\';
 37        // cout<<bit[i]<<" ";
 38     }
 39     cout<<endl;
 40 
 41     int ret=0;
 42     int temp=0;
 43     for(i=0;i<adr;i++)
 44         temp=temp*10+bit[i];
 45     ret+=temp;
 46     temp=0;
 47     for(i=adr;i<adr*2;i++)
 48         temp=temp*10+bit[i];
 49     ret+=temp;
 50     temp=0;
 51     for(i=adr*2;i<length;i++)
 52         temp=temp*10+bit[i];
 53     ret+=temp;
 54     temp=0;
 55    ret=ret%10000;
 56    cout<<"ret :"<<ret<<endl;
 57    return ret;
 58 }
 59 int insertHash(string str)
 60 {
 61     char ch[100];
 62     int index;
 63     strcpy(ch,str.c_str());
 64     index=hash_B(ch);
 65 
 66     if(hashTable[index].isnull == 0)  //没有发生冲突
 67     {
 68         hashTable[index].data = ch;
 69         hashTable[index].isnull = 1;
 70 
 71     }
 72     else    //当发生冲突的时候
 73     {
 74         while(hashTable[index].isnull == 1 && index<max)
 75         {
 76             index++;     //采用线性探测法,步长为1
 77         }
 78         if(index == max)    //Hash表发生溢出
 79             return -1;
 80         hashTable[index].data = ch;
 81         hashTable[index].isnull = 1;
 82 
 83     }
 84    // cout<<"index:  "<<index<<endl;
 85     return 0;
 86     //hashTable[index].data=ch;
 87     //hashTable[index].isnull=1;
 88 }
 89 
 90 bool findHash(string str)
 91 {
 92 
 93     char ch[100];
 94     int index,i;
 95     strcpy(ch,str.c_str());
 96     index=hash_B(ch);
 97     bool flag=0;
 98 
 99     for(i=index;i<max;i++)
100     {
101         if(hashTable[i].isnull==0)
102         {flag=0;break;}
103         if(str==hashTable[i].data)
104         {flag=1;break;}
105     }
106 
107 
108     return flag;
109 
110 }
111 int main()
112 {
113     initHash();
114     int n,m,i,j;
115     cout<<"输入:"<<endl;
116     cin>>n;
117     string str;
118     for(i=0;i<n;i++)
119     {
120         cin>>str;
121         if(insertHash(str)<0)
122         {cout<<"溢出"<<endl;break;}
123     }
124     cin>>m;
125     bool e[m];
126     for(i=0,j=0;i<m;i++,j++)
127     {
128         cin>>str;
129         if(findHash(str))
130             e[j]=1;
131         else
132             e[j]=0;
133     }
134     for(j=0;j<m;j++)
135     {
136         if(e[j])
137             cout<<"yes"<<endl;
138         else
139             cout<<"no"<<endl;
140     }
141     cin>>n;
142     return 0;
143 }
View Code

 

以上是关于hash表的建立和查找的主要内容,如果未能解决你的问题,请参考以下文章

hash表原理

HashMap的hash冲突解决方案

HashMap的hash冲突解决方案

哈希表与哈希(Hash)算法

Hash表的平均查找长度ASL计算方法

初步学习:hash存储和hash表的原理