创建hash表解决实际问题

来源:互联网 发布:有什么社交软件 编辑:程序博客网 时间:2024/05/18 03:43

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;
  }
 }
}

0 0
原创粉丝点击