当前位置: 首页 > article >正文

8622 哈希查找

SCAU数据结构OJ第五章

文章目录

  • 8622 哈希查找


8622 哈希查找

Description
使用哈希函数:H(k)=3*k MOD length,并采用开放定址法处理冲突。
试对输入的关键字序列构造哈希表,哈希表长度为length,求等概率情况下查找成功的平均查找长度,
并设计构造哈希表的完整的算法。本题给出部分代码,请补全Hash函数和解决冲突的collison函数。

输入格式
第一行:输入哈希表的长度;
第二行:输入关键字序列,用空格分隔,-1结束(-1不作为关键字)。
输出格式
第一行:输出哈希表里的数据,未使用的单元用X表示;
第二行:输出平均查找长度,格式为"Average search length="。

输入样例
11
22 41 53 46 30 13 1 67 -1
输出样例
22 X 41 30 1 53 46 13 67 X X
Average search length=2.000000

注意:这道题除了填空的地方之外,还得修改我备注的两个位置

代码如下:

#include"malloc.h" /* malloc()等 */
#include"stdlib.h" /* exit() */
#include"stdio.h"
#define EQ(a,b) ((a)==(b))
#define SUCCESS 1
#define UNSUCCESS 0
#define NULLKEY -1 /*哈希表无元素时值为-1*/
typedef int ElemType;
int length;
typedef struct
{
    ElemType *elem; /* 数据元素存储基址,动态分配数组 */
    int count; /* 当前数据元素个数 */
} HashTable;

void InitHashTable(HashTable *H)
{
    /* 操作结果: 构造一个长度为length的哈希表,length为全局变量 */
    int i;
    (*H).count=0; /* 当前元素个数为0 */
    (*H).elem=(ElemType*)malloc(length*sizeof(ElemType));
    if(!(*H).elem)
        exit(0); /* 存储分配失败 */
    for(i=0; i<length; i++)
        (*H).elem[i]=NULLKEY; /* 未填记录的标志 */
}
unsigned Hash(ElemType K)//hash函数是一种散列技术,将元素转化成哈希表的形式
{
    /* 一个简单的哈希函数*/
    return (3*K)%length;
}
void collision(int &p) //线性探测再散列,把*改为&:2346648648667
{
    /* 开放定址法处理冲突 */
    p++;//线性探测就是直接加1,二次探测就是先考虑加1的平方,再考虑减1的平方,再考虑加2的平方,再考虑减2的平方。。。。
}
int SearchHash(HashTable H,ElemType K,int *p,int *c)
{
    /* 在开放定址哈希表H中查找关键码为K的元素,若查找成功,以p指示待查数据 */
    /* 元素在表中位置,并返回SUCCESS;否则,以p指示插入位置,并返回UNSUCCESS */
    /* c用以计冲突次数,其初值置零,供建表插入时参考。算法9.17 */
    *p=Hash(K); /* 求得哈希地址 */
    while(H.elem[*p]!=NULLKEY&&!EQ(K,H.elem[*p]))
    {
        /* 该位置中填有记录,并且关键字不相等 */
        (*c)++;
        if(*c<length)
            collision(*p); //求得下一探查地址p,加上*:416535616516
        else
            break;
    }
    if EQ(K,H.elem[*p])
        return SUCCESS; /* 查找成功,p返回待查数据元素位置 */
    else
        return UNSUCCESS; /* 查找不成功(H.elem[p].key==NULLKEY),p返回的是插入位置 */
}
int InsertHash(HashTable *H,ElemType e)
{
    /* 查找不成功时插入数据元素e到开放定址哈希表H中,并返回查找长度 */
    int c,p;
    c=0;
    if(SearchHash(*H,e,&p,&c))   /* 表中已有与e有相同关键字的元素 */
        printf("哈希表中已有元素%d。\n",e);
    else  /* 插入e */
    {
        (*H).elem[p]=e;
        ++(*H).count;
    }
    return c+1; /*查找长度为冲突次数加1*/
}
void TraverseHash(HashTable H)
{
    /* 按哈希地址的顺序打印哈希表,无元素位置用X表示 */
    int i;
//    printf("HashTable Address:0~%d\n",length-1);
    for(i=0; i<length; i++)
        if(H.elem[i]==NULLKEY) /* 有数据 */
            printf("X ");
        else
            printf("%d ",H.elem[i]);
    printf("\n");
}
main()
{
    float i=0,j=0;
    ElemType e;
    HashTable H;
    //printf("Input Table length:");
    scanf("%d",&length);
    InitHashTable(&H);
    //printf("Input key words sequence, -1 conclusion input:");
    scanf("%d",&e);
    while(e!=-1)
    {
        j ++;  /*j记录输入元素个数*/
        i = i + InsertHash(&H,e);  /*i记录查找长度的和*/
        scanf("%d",&e);
    }
    TraverseHash(H);
    printf("Average search length=%f\n",i/j);//除数留余法,用元素的长度除以总个数
}



http://www.kler.cn/a/523552.html

相关文章:

  • Vue-day2
  • 展示统计信息收集情况
  • 2025美赛数学建模MCM/ICM选题建议与分析,思路+模型+代码
  • 71-《颠茄》
  • C++,STL,【目录篇】
  • postgres基准测试工具pgbench如何使用自定义的表结构和自定义sql
  • LabVIEW纤维集合体微电流测试仪
  • 子2023
  • Linux(19)——使用正则表达式匹配文本
  • Linux 下注册分析(2)
  • 第31章 测试驱动开发中的设计模式与重构解析(Python 版)
  • .net 如何处理网页的Json请求?
  • LLM评估优化与新技术创新综述
  • 基于STM32的数字多重仪表教学
  • 编程题-最长的回文子串(中等)
  • 一文讲解CMS收集器的垃圾收集过程
  • vue3阻止事件冒泡到父元素
  • FLTK - FLTK1.4.1 - demo - animgifimage-play
  • FLTK - FLTK1.4.1 - demo - animgifimage
  • 漂亮数 (线性筛+前缀和)
  • 【小白学AI系列】NLP 核心知识点(五)Transformer介绍
  • 99.19 金融难点通俗解释:营业总收入vs归母净利润vs扣非净利润
  • 新鲜速递:DeepSeek-R1开源大模型本地部署实战—Ollama + MaxKB 搭建RAG检索增强生成应用
  • 数论问题75
  • LeetCode题练习与总结:N 叉树的后序遍历--590
  • 2025年AI Agent(智能体)的发展机会