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

来源:互联网 发布:软件著作权 技术特点 编辑:程序博客网 时间:2024/05/21 07:07
/** Copyright (c)2015,烟台大学计算机与控制工程学院* All rights reserved.* 文件名称:项目2.cbp* 作    者:张晗* 完成日期:2015年12月18日* 版 本 号:v1.0* 问题描述:   已知一个关键字序列为if、while、for、case、do、break、else、struct、union、int、double、float、char、long、bool,     共15个字符串,哈希函数H(key)为关键字的第一个字母在字母表中的序号,哈希表的表长为26。       (1)若处理冲突的方法采用线性探测法,请设计算法,输出每个关键字对应的H(key),输出哈希表,并求成功情况下的平均查找长度。   (2)若处理冲突的方法采用链地址法,请设计算法,输出哈希表,并计算成功情况和不成功情况下的平均查找长度。 * 输入描述:无* 程序输出:测试数据*/


线性探测法

#include <stdio.h>#include <string.h>#define N 15#define M 26int H(char *s){    return ((*s-'a'+1)%M);}int main(){    char *s[N]= {"if", "while", "for", "case", "do", "break", "else", "struct", "union", "int", "double", "float", "char", "long", "bool"};    int i, j, k;    char HT[M][10];    int Det[M];   //存放探测次数    for(i=0; i<M; i++)    {        HT[i][0]='\0';        Det[i]=0;    }    printf("字符串 key\tH(key)\n");    printf("------------------------\n");    for(i=0; i<N; i++)    {        j=H(s[i]);  //求哈希值        printf("%s\t\t%d\n", s[i],j);        k=0;   //探测次数初值        while(1)        {            k++;    //累加探测次数            if(HT[j][0]=='\0')   //当不冲突时,直接放到该处            {                strcpy(HT[j], s[i]);                break;            }            else    //冲突时,采用线性探查法求下一个地址            {                j=(j+1)%M;            }        }        Det[j]=k;    }    printf("---------------------\n");    printf("哈希表\n");    printf("位置\t字符串\t探查次数\n");    printf("---------------------\n");    for(i=0; i<M; i++)        printf("%d\t%s\t%d\n", i, HT[i], Det[i]);    printf("---------------------\n");    k=0;    for(i=0; i<M; i++)        k+=Det[i];    printf("查找成功情况下的平均查找长度 %f\n", 1.0*k/N);    return 0;}


运行结果:

链地址法

#include <stdio.h>#include <string.h>#include <malloc.h>#define N 15#define M 26typedef struct node   //定义哈希链表的节点类型{    char *key;    struct node *next;} LNode;typedef struct{    LNode *link;} HTType;int H(char *s)   //实现哈希函数{    return ((*s-'a'+1)%M);}//构造哈希表void Hash(char *s[], HTType HT[]){    int i, j;    LNode *q;    for(i=0; i<M; i++)   //哈希表置初值        HT[i].link=NULL;    for(i=0; i<N; i++)   //存储每一个关键字    {        q=(LNode*)malloc(sizeof(LNode));   //创建新节点        q->key = (char*)malloc(sizeof(strlen(s[i])+1));        strcpy(q->key, s[i]);        q->next=NULL;        j=H(s[i]);    //求哈希值        if(HT[j].link==NULL)   //不冲突,直接加入            HT[j].link=q;        else        //冲突时,采用前插法插入        {            q->next = HT[j].link;            HT[j].link=q;        }    }}//输出哈希表void DispHT(HTType HT[]){    int i;    LNode *p;    printf("哈希表\n");    printf("位置\t关键字序列\n");    printf("---------------------\n");    for(i=0; i<M; i++)    {        printf(" %d\t", i);        p=HT[i].link;        while(p!=NULL)        {            printf("%s ", p->key);            p=p->next;        }        printf("\n");    }    printf("---------------------\n");}//求查找成功情况下的平均查找长度double SearchLength1(char *s[], HTType HT[]){    int i, k, count = 0;    LNode *p;    for(i=0; i<N; i++)    {        k=0;        p=HT[H(s[i])].link;        while(p!=NULL)        {            k++;   //p!=NULL,进入循环就要做一次查找            if(strcmp(p->key, s[i])==0)   //若找到,则退出                break;            p=p->next;        }        count+=k;    }    return 1.0*count/N;   //成功情况仅有N种}//求查找不成功情况下的平均查找长度double SearchLength2(HTType HT[]){    int i, k, count = 0;  //count为各种情况下不成功的总次数    LNode *p;    for(i=0; i<M; i++)    {        k=0;        p=HT[i].link;        while(p!=NULL)        {            k++;            p=p->next;        }        count+=k;    }    return 1.0*count/M;   //不成功时,在表长为M的每个位置上均可能发生}int main(){    HTType HT[M];    char *s[N]= {"if", "while", "for", "case", "do", "break", "else", "struct", "union", "int", "double", "float", "char", "long", "bool"};    Hash(s, HT);    DispHT(HT);    printf("查找成功情况下的平均查找长度 %f\n", SearchLength1(s, HT));    printf("查找不成功情况下的平均查找长度 %f\n", SearchLength2(HT));    return 0;}


运行结果:

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 50天婴儿鼻塞怎么办 50天新生儿鼻塞怎么办 40天婴儿鼻塞怎么办 孩子感冒鼻子塞怎么办 月子里感冒了怎么办 宝宝感冒鼻塞严重怎么办 婴幼儿鼻塞有痰怎么办 感冒了浑身没劲怎么办 四个月宝宝鼻塞怎么办 四个月小孩鼻塞怎么办 小儿流清水鼻涕怎么办 小孩总是流鼻子怎么办 四个月小孩咳嗽怎么办 儿童流清水鼻涕怎么办 四个月婴儿发烧怎么办 宝宝体温36度怎么办 儿童感冒后鼻塞怎么办 儿童没感冒鼻塞怎么办 宝宝鼻塞怎么办3岁 儿童刚开始感冒鼻塞怎么办 婴儿感冒打喷嚏流鼻涕怎么办 宝宝感冒鼻涕多怎么办 一个多月的宝宝鼻塞怎么办 五个月宝宝鼻塞怎么办 4个月大婴儿鼻塞怎么办 四个月婴儿鼻塞怎么办 鼻炎晚上睡觉鼻塞怎么办 感冒了一直流鼻涕怎么办 感冒了鼻塞严重怎么办 两边鼻子都塞怎么办 感冒睡觉鼻子堵怎么办 孩子鼻炎流清水怎么办 小儿鼻涕流不停怎么办 老是单侧流鼻涕怎么办 有鼻炎光流鼻涕怎么办 一只鼻塞流鼻涕怎么办 鼻子总痒流鼻涕怎么办 鼻子总是痒流鼻涕怎么办 感冒后老流鼻涕怎么办 鼻炎犯了鼻塞怎么办 鼻炎鼻塞鼻涕多怎么办