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

来源:互联网 发布:centos tmp 自动删除 编辑:程序博客网 时间:2024/06/05 23:51

问题及代码:

/*             *Copyright(c++)2015,烟台大学计算机与控制工程学院             *All rights reserved.             *文件名称:CPP1.cpp             *作者:宋 晨             *完成日期:2015年12月07日             *版本号: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)若处理冲突的方法采用链地址法,请设计算法,输出哈希表,并计算成功情况和不成功情况下的平均查找长度。*/    
(1)

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


(2)

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


运行结果:

(1)


(2)


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 人工喂养大便次数少怎么办 4个月宝宝肠炎怎么办? 三个月的宝宝拉肚子有奶瓣怎么办 吃米粉后不拉屎怎么办 宝宝拉绿色稀水怎么办 3个月宝宝肠胃炎怎么办 两个月婴儿拉水怎么办 3个月宝宝拉绿水怎么办 宝宝拉绿色的水怎么办 宝宝大便绿又水怎么办 8个月婴儿便秘怎么办 2个月婴儿便秘怎么办 四个月宝宝拉稀带有泡沫怎么办 六个月宝宝拉肚子怎么办拉水 婴儿拉的是沫怎么办 婴儿拉泡沫屎是怎么办 宝宝吃奶粉上火大便干燥怎么办 没满月的宝宝拉肚子怎么办 婴儿吃奶粉上火不大便怎么办 四个月宝宝拉沫怎么办 4个月小孩拉肚子怎么办 3个月的宝宝拉稀怎么办 宝宝没喝过奶粉怎么办 宝宝喝冰酸奶咳嗽了怎么办 7个月不爱喝奶怎么办 宝宝不认妈妈该怎么办 九个月宝宝不喝牛奶怎么办 吃羊肉和西瓜后怎么办 娃儿感冒了很咳怎么办 5岁娃儿经常感冒发烧怎么办 娃儿冷得发抖感冒怎么办 吃羊肉和茶后怎么办 宝宝胆汁酸高22怎么办 5个月发烧38度怎么办 28个月宝宝不愿把尿怎么办 16个月宝宝咳嗽怎么办 宝宝晚上不用纸尿裤要尿床怎么办 宝宝头型睡偏了怎么办 初生婴儿鼻子被奶块堵住怎么办 月经排的不顺畅怎么办 四个月的小孩拉肚子怎么办