hash表在查找上有很高效率,其主要原因是它把这个值与表下标建立了
直接存取的关系,所以使用hash查找所消耗的时间仅仅是数组引用成员
值的过程。
那么我们如何使用hash表解决问题,可分为以下几步,
1。定义哈希表.
在定义哈希表时,对于哈希表的成员,一般定义成结构体的样子。
所以哈希表是一个结构体数据。其中有key值,要查找的数据,还有查找长度。
2. 计算key值
要想通过数据得到key值,一般要通过一个函数,对于字符,中文等,
可以通过ascii码值。对于字符串则一般使用字符串各字符ascii码值的和
最后映射成表的key值时,还要对表长进行一定操作,有时是求余操作。
3. 初始化hash表。
对于建立hash表值时,将结构体中的数值,key值,查找长度填入即可,
但是如果发生冲突,则应再重新找,一般采用 伪随机探测再
散列法处理处理即可(其散列函数一般是key+1再与表长操作)
例子:对姓名用hash表存放
hash的key值采用各个字符ascii值相加的方式。
随机探测散列函数采用key=(key + key%10 + 1)%表长
以下中文显示为乱码。
#include <stdio.h>
#include<conio.h>
#include<string.h>
//#include<windows.h>
#define HASH_LEN 50 //¹þÏ£±íµÄ³¤¶È
#define M 47
#define NAME_NO 30 //ÈËÃûµÄ¸öÊý
typedef struct NAME
{
char *py; //Ãû×ÖµÄÆ´Òô
int k; //Æ´ÒôËù¶ÔÓ¦µÄÕûÊý
}NAME;
NAME NameList[HASH_LEN];
typedef struct hterm //¹þÏ£±í
{
char *py; //Ãû×ÖµÄÆ´Òô
int k; //Æ´ÒôËù¶ÔÓ¦µÄÕûÊý
int si; //²éÕÒ³¤¶È
}HASH;
HASH HashList[HASH_LEN];
void InitNameList()
{
NameList[0].py="hanbiao";
NameList[1].py="dingjian";
NameList[2].py="linlukun";
NameList[3].py="wangshaowei";
NameList[4].py="taojun";
NameList[5].py="lijie";
NameList[6].py="shiyanqiang";
NameList[7].py="liuning";
NameList[8].py="modapeng";
NameList[9].py="guoqiang";
NameList[10].py="dudachhao";
NameList[11].py="zhangyingjie";
NameList[12].py="zhuhongbing";
NameList[13].py="ruanjiangyang";
NameList[14].py="dingyankun";
NameList[15].py="xiedajia";
NameList[16].py="zhengguolin";
NameList[17].py="chenwei";
NameList[18].py="yewei";
NameList[19].py="sundedong";
NameList[20].py="wanbinbin";
NameList[21].py="zhangliang";
NameList[22].py="gaopen";
NameList[23].py="xiaofan";
NameList[24].py="weijinchao";
NameList[25].py="weichunshui";
NameList[26].py="wangfei";
NameList[27].py="caojian";
NameList[28].py="zhushouyuan";
NameList[29].py="liwei";
char *f;
int r,s0;
for (int i=0;i<NAME_NO;i++) //Çó³ö¸÷¸öÐÕÃûµÄÆ´ÒôËù¶ÔÓ¦µÄÕûÊý
{
s0=0;
f=NameList[i].py;
for (r=0;*(f+r) != '\0';r++) //·½·¨£º½«×Ö·û´®µÄ¸÷¸ö×Ö·ûËù¶ÔÓ¦µÄASCIIÂëÏà¼Ó£¬ËùµÃµÄÕûÊý×öΪ¹þÏ£±íµÄ¹Ø¼ü×Ö
s0=*(f+r)+s0;
NameList[i].k=s0;
}
}
void CreateHashList()
{
for (int i=0; i<HASH_LEN;i++) //¹þÏ£±íµÄ³õʼ»¯
{
HashList[i].py="";
HashList[i].k=0;
HashList[i].si=0;
}
for (i=0; i<NAME_NO; i++)
{
int sum=0;
int adr=(NameList[i].k) % M; //¹þÏ£º¯Êý
int d=adr;
if(HashList[adr].si==0) //²»³åͻʱ
{
HashList[adr].k=NameList[i].k;
HashList[adr].py=NameList[i].py;
HashList[adr].si=1;
}
else //³åͻʱ
{
do
{
d=(d+((NameList[i].k))%10+1)%M; //αËæ»ú̽²âÔÙÉ¢Áз¨´¦Àí
sum=sum+1; //²éÕÒ´ÎÊý¼Ó1
}while (HashList[d].k!=0);
HashList[d].k=NameList[i].k;
HashList[d].py=NameList[i].py;
HashList[d].si=sum+1;
}
}
}
void FindList()
{
printf("\n\nÇëÊäÈëÐÕÃûµÄÆ´Òô: "); //ÊäÈëÐÕÃû
char name[20]={0};
scanf("%s",name);
int s0=0;
for (int r=0;r<20;r++) //Çó³öÐÕÃûµÄÆ´ÒôËù¶ÔÓ¦µÄÕûÊý(¹Ø¼ü×Ö)
s0+=name[r];
int sum=1;
int adr=s0 % M; //ʹÓùþÏ£º¯Êý
int d=adr;
if(HashList[adr].k==s0) //·Ö3ÖÖÇé¿ö½øÐÐÅжÏ
printf("\nÐÕÃû:%s ¹Ø¼ü×Ö:%d ²éÕÒ³¤¶ÈΪ: 1",HashList[d].py,s0);
else if (HashList[adr].k==0)
printf("Î޸üǼ!");
else
{
int g=0;
do
{
d=(d+s0%10+1)%M; //αËæ»ú̽²âÔÙÉ¢Áз¨´¦Àí
sum=sum+1;
if (HashList[d].k==0)
{
printf("Î޼Ǽ! ");
g=1;
}
if (HashList[d].k==s0)
{
printf("\nÐÕÃû:%s ¹Ø¼ü×Ö:%d ²éÕÒ³¤¶ÈΪ:%d",HashList[d].py,s0,sum);
g=1;
}
}while(g==0);
}
}
void Display()
{
printf("\n\nµØÖ·\t¹Ø¼ü×Ö\t\tËÑË÷³¤¶È\tH(key)\t\tÆ´Òô \n"); //ÏÔʾµÄ¸ñʽ
for(int i=0; i<15; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
printf("°´ÈÎÒâ¼ü¼ÌÐøÏÔʾ...\n"); //ÓÉÓÚÊý¾Ý±È½Ï¶à£¬ËùÒÔ·ÖÆÁÏÔʾ
getch();
for( i=15; i<30; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
printf("°´ÈÎÒâ¼ü¼ÌÐøÏÔʾ...\n");
getch();
for( i=30; i<40; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
printf("°´ÈÎÒâ¼ü¼ÌÐøÏÔʾ...\n");
getch();
for( i=40; i<50; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
float average=0;
for (i=0;i<HASH_LEN;i++)
average+=HashList[i].si;
average/=NAME_NO;
printf("\n\nƽ¾ù²éÕÒ³¤¶È£ºASL(%d)=%f \n\n",NAME_NO,average);
}
void main()
{
printf("\n------------------------¹þÏ£±íµÄ½¨Á¢ºÍ²éÕÒ----------------------");
InitNameList();
CreateHashList ();
while(1)
{
printf("\n\n");
printf(" 1. ÏÔʾ¹þÏ£±í\n");
printf(" 2. ²éÕÒÈËÃû\n");
printf(" 3. Í˳ö±¾³ÌÐò\n");
err:
char ch1=getch();
if (ch1=='1')
Display();
else if (ch1=='2')
FindList();
else if (ch1=='3')
return;
else
{
printf("\nÊäÈëÓÐÎóÇëÖØÐÂÊäÈë!");
goto err;
}
}
}