
NOJ-构造哈希表
发布日期:2021-05-07 23:16:34
浏览次数:18
分类:原创文章
本文共 2141 字,大约阅读时间需要 7 分钟。
预备知识
基于线性表和基于树的查找方法中,记录在列表中的位置是随机的,与记录的关键字没有直接关系。查找的效率依赖于查找过程中所进行的比较次数。
哈希方法基本思想:创建哈希表时,把关键字k的元素直接存入地址为H(k)的单元,H称为哈希函数,以后当查找关键字为k的元素时,再利用哈希函数计算出该元素的存储位置p=H(k),从而达到按关键字直接存取元素的目的。
处理冲突
本题用到的是最简单的线性探测再散列来处理冲突。
基本思路:当发生冲突(目标位置已经有元素,但不是要查找的元素)时,每次增量取1。
代码
#include<stdio.h>#include<stdlib.h>#define m 11#define NULLKEY 0typedef struct { int key; int flag;}RecordType;typedef RecordType HashTable[m];int Hash(int K);//哈希函数void CreateHashTable(HashTable &ht, int data[], int len);//创建哈希表int main(){ int data[8] = { 22, 41, 53, 46, 30, 13, 01, 67}; int sum = 0; HashTable ht; CreateHashTable(ht, data, 8); for (int i=0;i<m;i++) { sum += ht[i].flag; } printf("%d", sum / 8);}int Hash(int K){ return (3 * K) % 11;}void CreateHashTable(HashTable &ht,int data[],int len){ for (int i=0;i<m;i++) { ht[i].flag = 0; ht[i].key = 0; } int flag = 1; for (int i=0;i<len;i++) { int h = Hash(data[i]); if(ht[h].key==NULLKEY) { ht[h].key = data[i]; ht[h].flag = 1; } else{ while(ht[h].key!=NULLKEY) { h++; flag++; } ht[h].key = data[i]; ht[h].flag = flag; flag = 1; } }}
代码解释
typedef struct { int key;//关键字 int flag;//标记位,用来记录为了查找该元素一共用了多少次线性探测再散列}RecordType;
这个结构体用来记录每一个记录共需要查找的次数和关键字。
2.
void CreateHashTable(HashTable &ht,int data[],int len){ for (int i=0;i<m;i++) { ht[i].flag = 0; ht[i].key = 0; } int flag = 1; for (int i=0;i<len;i++) { int h = Hash(data[i]); if(ht[h].key==NULLKEY) { ht[h].key = data[i]; ht[h].flag = 1; } else{ while(ht[h].key!=NULLKEY) { h++; flag++; } ht[h].key = data[i]; ht[h].flag = flag; flag = 1; } }}
这个函数是用来创建哈希表的:
1. 当没有冲突的时候,查找次数为1。
2. 否则查找次数等于1+查找所需的增量d。
最后只需要把每一个记录所需的查找次数取平均值即为平均查找长度。
小声说:“如果你只想AC的话,直接printf("2");就可以了。当然这对理解哈希表没有什么帮助。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月10日 16时36分58秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Git 配置SSH公钥、私钥
2021-05-09
极客时间离线课堂
2021-05-09
Spring Session
2021-05-09
koa2 中间件里面的next到底是什么
2021-05-09
在create-react-app创建的项目下允许函数绑定运算符
2021-05-09
博客园新闻频道开始公开测试
2021-05-09
评论表聚集索引引起的评论超时问题
2021-05-09
博客园上海俱乐部4月份活动通知邀请函已经发出!
2021-05-09
上周热点回顾(5.24-5.30)
2021-05-09
Internet Explorer 10 专题上线
2021-05-09
云计算之路-阿里云上:0:25~0:40网络存储故障造成网站不能正常访问
2021-05-09
网站故障公告1:使用阿里云RDS之后一个让人欲哭无泪的下午
2021-05-09
上周热点回顾(12.31-1.6)
2021-05-09
上周热点回顾(1.21-1.27)
2021-05-09
上周热点回顾(6.3-6.9)
2021-05-09
上周热点回顾(8.12-8.18)
2021-05-09
【故障公告】升级阿里云 RDS SQL Server 实例故障经过
2021-05-09
蹒跚来迟:新版博客后台上线公测
2021-05-09
上周热点回顾(9.16-9.22)
2021-05-09
上周热点回顾(11.4-11.10)
2021-05-09