实现一个hash_map,要求key为string,valure任意
一 string 字符串转整数
方法1:将字符串中字符ASCII码值加起来,返回的值就是字符串对应的整数
如果存储的表很长,那么这种整数HASH后将导致集中在表前部分,分布不均衡;
方法2:
int string2int(const char *key){
int hashint=0;
while(*key!='\0'){
hashint=(hashint<<5)+*key;
key++;
}
return hashint;
}
二 基于链表形式的hash_map
#ifndef _hash_link
#define _hash_link
class hash_node{
public:
int values;
hash_node*next;
hash_node():values(-1),next(NULL){}
hash_node(int k):values(k),next(NULL){}
};
class table_node{
public:
int key;
hash_node*ptr;
public:
table_node(int v):key(v),ptr(NULL){}
table_node(table_node&s):key(s.key),ptr(s.ptr){}
};
class hash_link{
private:
int num;
table_node* arr;
public:
hash_link(int nums):num(nums){
arr=(table_node*)malloc(sizeof(table_node)*num);
int i;
for(i=0;i<num;i++)
{
table_node tmp(i);
arr[i]=tmp;
}
}
int Find(table_node a[],int m,int k){
int i=k%m;
hash_node*p=NULL;
p=a[i].ptr;
while(p&&p->values!=k)p=p->next;
if(p)return i;
return -1;
}
void Find(int k){
int index1=Find(arr,num,k);
cout<<k<<"is at"<<index1<<endl;
}
void Insert(table_node a[],int n,int k){
int i=k%n;
hash_node*p=a[i].ptr;
hash_node*s=new hash_node(k);
if(p==NULL)a[i].ptr=s;
else{
while(p->next){p=p->next;}
p->next=s;
}
}
void Insert(int k){
Insert(arr,num,k);
}
void Remove(table_node a[],int n,int k){
int i=Find(arr,n,k);
if(i==-1)return;
hash_node*p=a[i].ptr;
if(p->values==k){a[i].ptr=p->next;delete p;}
else{
hash_node*q=a[i].ptr;
while(p&&p->values!=k){q=p;p=p->next;}
q->next=p->next;delete p;
}
}
void Remove(int k){
Remove(arr,num,k);
}
};
#endif
三基于顺序表形式的hash_map
class hash_seq{
private:
table_node1*arr;
int nums;
public:
hash_seq(int m){
nums=m;
arr=(table_node1*)malloc(sizeof(table_node1)*nums);
int i;
for(i=0;i<nums;i++)
{
table_node1 tmp(i,0);
arr[i]=tmp;
}
}
int Find(table_node1 a[],int m,int k){
int add=k%m;
int i=0;
while(a[add].flag!=0&&a[add].key!=k){i++;add=(add+1)%m;if(i==m)break;}
if(a[add].key==k)return add;
else return -1;
}
void Find(int k){
cout<<k<<"is at"<<Find(arr,nums,k);
}
void Insert(table_node1 a[],int m,int k){
int add=k%m;
int i=0;
while(a[add].flag!=0){add=(add+1)%m;i++;if(i>m)break;}
if(i>m)return;
a[add].flag=1;a[add].key=k;
}
void Insert(int k){
Insert(arr,nums,k);
}
void Remove(table_node1 a[],int m, int k){
int add=Find(a,m,k);
if(add==-1)return;
a[add].flag=0;
}
void Remove(int k){
Remove(arr,nums,k);
}
};
#endif