Hash冲突解决——拉链法

来源:互联网 发布:数据库怎么加锁 编辑:程序博客网 时间:2024/05/13 14:24

本文略微讲解用静态链接表解决Hash冲突解决。
首先给出 n 以及 n 个字符串,要求储存并便于查找。

样例

输入

  3  abcdefg  gabcedf  kajshdb

解析

先定义结构体:

  struct node{    char str[100];//储存字符串    int next;     //记录上一个结构体编号};node edge[1000];  

我将使用一种很简单易冲突的Hash函数,见代码:

  int Hash(char str[]){    int i,len,sum=0;    len=strlen(str+1);    for(i=1;i<=len;i++){        sum+=str[i]-'a'+1;    }    return sum%51;}  

易得第一,第二字符串返回的Hash值都是28,发生冲突,可实际上在我看来,无论是否冲突,我们都可以使用静态链接表储存,例如str[]使用pre[Hash(str[])]储存。
如下代码:

void add(int val,char s[]){   //val是Hash返回值    edge[++edge_num].next=pre[val];    int len=strlen(s+1);    for(int i=1;i<=len;i++)     edge[edge_num].str[i]=s[i];    pre[val]=edge_num;}        //静态链接表储存操作   for(int i=1;i<=n;i++){        scanf("%s",str[i]+1);        int k=Hash(str[i]);        add(k,str[i]);    } 

讲到这儿就差不多了

完整代码:

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;int Hash(char str[]){    int i,len,sum=0;    len=strlen(str+1);    for(i=1;i<=len;i++){        sum+=str[i]-'a'+1;    }    return sum%51;}struct node{    char str[100];    int next;};node edge[1000];int pre[100],edge_num;void add(int val,char s[]){    edge[++edge_num].next=pre[val];    int len=strlen(s+1);    for(int i=1;i<=len;i++)     edge[edge_num].str[i]=s[i];    pre[val]=edge_num;}int main(){    int n;    char str[100][100];    scanf("%d",&n);    for(int i=1;i<=n;i++){        scanf("%s",str[i]+1);        int k=Hash(str[i]);        add(k,str[i]);    }    for(int i=0;i<51;i++){        if(pre[i]!=0){            printf("Hash_num %d:",i);            for(int j=pre[i];j!=0;j=edge[j].next){              for(int k=1;k<=strlen(edge[j].str+1);k++)               printf("%c",edge[j].str[k]);              if(edge[j].next!=0)               printf("->");            }            printf("\n");        }     }}

样例输出结果

  Hash_num 4:kajshdb  Hash_num 28:gabcedf->abcdefg

代码有点丑,哎