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 }
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 }
以上是关于hash表的建立和查找的主要内容,如果未能解决你的问题,请参考以下文章