【第十五周项目2 - 用哈希法组织关键字】

来源:互联网 发布:最新彩票预测软件 编辑:程序博客网 时间:2024/06/08 04:12
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  * Copyright (c) 2016, 烟台大学计算机与控制工程学院 
  3.  * All rights reserved. 
  4.  * 文件名称:Cube007.cpp 
  5.  * 作    者:杨俊杰
  6.  * 完成日期:2016年12月15日 
  7.  * 
  8.  * 问题描述:已知一个关键字序列为if、while、for、case、do、break、else、struct、union、int、double、float、char、long、bool,共15个字符串,哈希函数H(key)为关键字的第一个字母在字母表中的序号,哈希表的表长为26。 
  9.  * 输入描述:无 
  10.  * 输出描述:结果 
  11.  */  

(1)若处理冲突的方法采用线性探测法,请设计算法,输出每个关键字对应的H(key),输出哈希表,并求成功情况下的平均查找长度。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #define N 15  
  4. #define M 26  
  5. int H(char *s)  
  6. {  
  7.     return ((*s-'a'+1)%M);  
  8. }  
  9.   
  10. int main()  
  11. {  
  12.     char *s[N]= {"if""while""for""case""do""break""else""struct""union""int""double""float""char""long""bool"};  
  13.     int i, j, k;  
  14.     char HT[M][10];  
  15.     int Det[M];   //存放探测次数  
  16.     for(i=0; i<M; i++)  
  17.     {  
  18.         HT[i][0]='\0';  
  19.         Det[i]=0;  
  20.     }  
  21.     printf("字符串 key\tH(key)\n");  
  22.     printf("------------------------\n");  
  23.     for(i=0; i<N; i++)  
  24.     {  
  25.         j=H(s[i]);  //求哈希值  
  26.         printf("%s\t\t%d\n", s[i],j);  
  27.         k=0;   //探测次数初值  
  28.         while(1)  
  29.         {  
  30.             k++;    //累加探测次数  
  31.             if(HT[j][0]=='\0')   //当不冲突时,直接放到该处  
  32.             {  
  33.                 strcpy(HT[j], s[i]);  
  34.                 break;  
  35.             }  
  36.             else    //冲突时,采用线性探查法求下一个地址  
  37.             {  
  38.                 j=(j+1)%M;  
  39.             }  
  40.         }  
  41.         Det[j]=k;  
  42.     }  
  43.     printf("---------------------\n");  
  44.     printf("哈希表\n");  
  45.     printf("位置\t字符串\t探查次数\n");  
  46.     printf("---------------------\n");  
  47.     for(i=0; i<M; i++)  
  48.         printf("%d\t%s\t%d\n", i, HT[i], Det[i]);  
  49.     printf("---------------------\n");  
  50.     k=0;  
  51.     for(i=0; i<M; i++)  
  52.         k+=Det[i];  
  53.     printf("查找成功情况下的平均查找长度 %f\n", 1.0*k/N);  
  54.     return 0;  
  55. }  


运行结果:

0 0
原创粉丝点击