用链表和数组实现HASH表,几种碰撞冲突解决方法

 

 

  Hash算法中要解决一个碰撞冲突的办法,后文中描述了几种解决方法。下面代码中用的是链式地址法,就是用链表和数组实现HASH表。

he/*hash table max size*/
#define HASH_TABLE_MAX_SIZE 40/*hash table大小*/
int hash_table_size=0;/*.BH-----------------------------------------------------------------
**                 结构体定义
**.EH-----------------------------------------------------------------
*/
/*hashTable结构*/
typedef int HashKeyType;
typedef struct{     OMS_TYPE__CurrFaultReport curr_fault_report;unsigned int begin_time[SYS_FAULT_REPORT_MAX_NUM];unsigned int end_time[SYS_FAULT_REPORT_MAX_NUM];unsigned int report_valid[SYS_FAULT_REPORT_MAX_NUM];
}HashValueType;typedef struct HashNode_Struct HashNode;
struct HashNode_Struct
{HashKeyType sKey;HashValueType nValue;HashNode* pNext;
};
HashNode* hashTable[HASH_TABLE_MAX_SIZE]; //hash table data strcutrue/*=================hash table function======================*/
/*.BH-----------------------------------------------------------------
**
**函数名:
**
**功能:string hash function
**
**参数: 无
**
**返回值:无
**
**设计注记:
**
**.EH-----------------------------------------------------------------
*/
unsigned int hash_table_hash_str(const char* skey)
{const signed char *p = (const signed char*)skey;unsigned int h = *p;if(h){for(p += 1; *p != '\0'; ++p){h = (h << 5) - h + *p;}}return h;
}/*.BH-----------------------------------------------------------------
**
**函数名:
**
**功能:insert key-value into hash table
**
**参数: 无
**
**返回值:无
**
**设计注记:
**
**.EH-----------------------------------------------------------------
*/
int hash_table_insert(const HashKeyType skey, HashValueType nvalue)
{unsigned int pos = 0;HashNode* pHead = NULL;HashNode* pNewNode = NULL;if (hash_table_size >= HASH_TABLE_MAX_SIZE){printf("out of hash table memory!\n");return 0;}pos = hash_table_hash_str(skey) % HASH_TABLE_MAX_SIZE;pHead = hashTable[pos];while (pHead){if (pHead->sKey == skey){printf("hash_table_insert: key %d already exists!\n", skey);return 0;}pHead = pHead->pNext;}pNewNode = (HashNode*)malloc(sizeof(HashNode));memset(pNewNode, 0, sizeof(HashNode));pNewNode->sKey = skey;memcpy(&pNewNode->nValue, &nvalue, sizeof(HashValueType));pNewNode->pNext = hashTable[pos];hashTable[pos] = pNewNode;hash_table_size++;return 1;
}/*.BH-----------------------------------------------------------------
**
**函数名:
**
**功能:lookup a key in the hash table
**
**参数: 无
**
**返回值:无
**
**设计注记:
**
**.EH-----------------------------------------------------------------
*/
HashNode* hash_table_find(const HashKeyType skey)
{unsigned int pos = 0;pos = hash_table_hash_str(skey) % HASH_TABLE_MAX_SIZE;if (hashTable[pos]){HashNode* pHead = hashTable[pos];while (pHead){if (skey == pHead->sKey)return pHead;pHead = pHead->pNext;}}return NULL;
}/*.BH-----------------------------------------------------------------
**
**函数名:
**
**功能:free the memory of the hash table
**
**参数: 无
**
**返回值:无
**
**设计注记:
**
**.EH-----------------------------------------------------------------
*/
void hash_table_release()
{int i;for (i = 0; i < HASH_TABLE_MAX_SIZE; ++i){if (hashTable[i]){HashNode* pHead = hashTable[i];while (pHead){HashNode* pTemp = pHead;pHead = pHead->pNext;if (pTemp){free(pTemp);}}}}
}//remove key-value frome the hash table
/*.BH-----------------------------------------------------------------
**
**函数名:
**
**功能:string hash function
**
**参数: 无
**
**返回值:无
**
**设计注记:
**
**.EH-----------------------------------------------------------------
*/
void hash_table_remove(const HashKeyType skey)
{unsigned int pos = hash_table_hash_str(skey) % HASH_TABLE_MAX_SIZE;if (hashTable[pos]){HashNode* pHead = hashTable[pos];HashNode* pLast = NULL;HashNode* pRemove = NULL;while (pHead){if (skey == pHead->sKey){pRemove = pHead;break;}pLast = pHead;pHead = pHead->pNext;}if (pRemove){if (pLast)pLast->pNext = pRemove->pNext;elsehashTable[pos] = NULL;free(pRemove);}}hash_table_size--;
}/*.BH-----------------------------------------------------------------
**
**函数名:
**
**功能:print the content in the hash table
**
**参数: 无
**
**返回值:无
**
**设计注记:
**
**.EH-----------------------------------------------------------------
*/
void hash_table_print()
{int i;printf("===========content of hash table===========\n");for (i = 0; i < HASH_TABLE_MAX_SIZE; ++i){if (hashTable[i]){HashNode* pHead = hashTable[i];printf("%d=>", i);while (pHead){printf("%d:%d  ", pHead->sKey, pHead->nValue.begin_time);pHead = pHead->pNext;}printf("\n");}}
}/*.BH-----------------------------------------------------------------
**
**函数名:
**
**功能:初始化系统名称的hashTable,插入所有系统名称
**
**参数: 无
**
**返回值:无
**
**设计注记:
**
**.EH-----------------------------------------------------------------
*/
void Common_InitHashTable()
{hash_table_size = 0;memset(hashTable, 0, sizeof(HashNode*) * HASH_TABLE_MAX_SIZE);
}

 

Hash碰撞冲突

Hash函数的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰撞冲突。如下将介绍如何处理冲突,当然其前提是一致性hash。

1.开放地址法

开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1)
其中,m为哈希表的表长。di 是产生冲突的时候的增量序列。如果di值可能为1,2,3,…m-1,称线性探测再散列。
如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,…k*k,-k*k(k<=m/2),称二次探测再散列。
如果di取值可能为伪随机数列。称伪随机探测再散列。

2.再哈希法

当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。
比如上面第一次按照姓首字母进行哈希,如果产生冲突可以按照姓字母首字母第二位进行哈希,再冲突,第三位,直到不冲突为止

3.链地址法(拉链法)

将所有关键字为同义词的记录存储在同一线性链表中。如下:


因此这种方法,可以近似的认为是筒子里面套筒子

4.建立一个公共溢出区

假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。

优缺点:

优点:

①拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
②由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
③开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
④在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结 点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在 用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。

缺点:

指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。

 

开放地址法和拉链法是比较常用的两种,各有优缺点,开放地址法的过程可以参考以下链接。

参考链接:HASH碰撞

转载于:https://www.cnblogs.com/AndrewYin/p/9203621.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Chrome中保存您当前的所有标签,以便以后阅读

Chrome allows you to open tabs from your last browsing session when you open the browser. However, what if you want to save your current set of tabs to re-open at any time? Chrome doesn’t provide a way to do that natively, but there is an easy workaround…

ubuntu 16.04(Windows 10双系统+grub引导)无法进入tt1~tt6(NVIDIA驱动安装相关-黑屏,login loop,分辨率)...

目录 前言回顾最终解决&#xff1a;0.关闭x服务1.禁用nouveau2.加入3.更新4.查找匹配驱动5.选择推荐版本6.等待安装后重启,nvidia-smi查看是否安装成功,或者lsmod | grep nvidia&#xff0c;成功结果如下7.重启x服务8.此时还不能进入图形界面&#xff0c;因为nomodeset还在&…

(备忘)打开office2010总是在配置进度

1、同时按上键盘上面的windows键和R键&#xff0c;出现“运行” 2、输入“regedit”&#xff0c;回车进入注册表 3、点击“HKEY_CURRENT_USER”展开&#xff0c;依次“Software”--“Microsoft”--“Office”--"14.0"--"Word"展开&#xff0c;点击"Op…

android 更改软键盘_如何在Android的Google键盘上更改声音和振动

android 更改软键盘Tactile feedback from a touch screen keyboard is crucial, in my opinion, but I don’t like sounds when I tap keys. You may not be like me—maybe sounds are your thing, but vibration is annoying. Or maybe you dislike both (you rebel!). The…

知识点:Mysql 索引原理完全手册(1)

知识点&#xff1a;Mysql 索引原理完全手册(1) 知识点&#xff1a;Mysql 索引原理完全手册(2) 知识点&#xff1a;Mysql 索引优化实战(3) 知识点&#xff1a;Mysql 数据库索引优化实战(4) Mysql-索引原理完全手册 一、 介绍二、 索引的原理三、 索引的数据结构四、 聚集索引与辅…

如何将Apple Mail建议用于事件和联系人

Apple products come preinstalled with an email client that can, on occasion, be quite smart. Today we want to show you another great feature: suggestions for event and contacts. Apple产品预装了一个电子邮件客户端&#xff0c;该客户端有时可能非常聪明。 今天&a…

xbox one 越狱_如何在Xbox One上播放视频和音乐文件

xbox one 越狱The Xbox One has integrated TV features and support for streaming media apps like Netflix and Hulu, but that isn’t where it ends. You can play video and music files you’ve ripped or downloaded by plugging in a USB drive or streaming them ove…

C++实验七

11——3 #include<fstream>using namespace std;int main(){ ofstream file; file.open("test1.txt",ios_base::binary); file<<"已成功添加字符&#xff01;"; file.close(); return 0; } 11-4 #include<fstream>#include<iostrea…

重新学习web后端开发-001-写在前面的话

"长风破浪会有时 直挂云帆济沧海" —— 李白<!-- more --> 1. 为什么会写这个系列 随着互联网技术飞速的非常&#xff0c;web开发一直都是互联网技术的重要部分之一。在作者十余年的工作中&#xff0c;经历了从程序员到高级工程师&#xff0c;然后开始负责项目…

WPF-20 ICommand命令绑定

这节我们介绍一下WPF中比较重要的接口ICommand&#xff0c;也是WPF中一个新的特性&#xff0c;做过WinForm朋友都知道&#xff0c;WinForm开发是基于事件驱动开发模式&#xff0c;比如一个Button有Click事件&#xff0c;当我点击该按钮时&#xff0c;在当前页面会执行具体的业务…

如何在Safari中查看网页的完整URL

Modern versions of Safari don’t show the entire URL of a page in the address bar—it just shows the web site’s domain name. If this bothers you, it’s easy to change. Safari的现代版本无法在地址栏中显示页面的整个URL&#xff0c;而仅显示网站的域名。 如果这困…

Mqttnet内存与性能改进录

1 MQTTnet介绍MQTTnet是一个高性能的 .NET MQTT库&#xff0c;它提供MQTT客户端和MQTT服务器的功能&#xff0c;支持到最新MQTT5协议版本&#xff0c;支持.Net Framework4.5.2版本或以上。MQTTnet is a high performance .NET library for MQTT based communication. It provid…

DataArtisans战略联手阿里云 Apache Flink服务能力云化

近日&#xff0c;Apache Flink商业公司 CEO、联合创始人Kostas Tzoumas在云栖大会上宣布和阿里集团达成战略合作伙伴关系&#xff0c;希望能够借助全球最大的云计算公司之一阿里云&#xff0c;服务更多的大数据实时流计算的客户。同时期待通过加强和阿里集团技术合作&#xff0…

高清、免版权美图资源大全

正所谓“一图胜千言”&#xff0c;当在写文章、做设计、搞 PPT、发朋友圈&#xff0c;搭配一些合适的图&#xff0c;这无疑将极大提升内容的表现力。鉴于此&#xff0c;在倾城之链的美图板块&#xff0c;收录了来自世界各地的优质图片网站&#xff0c;它们所提供高品质且免费的…

如何在WhatsApp中将群聊静音

Group Chats are awesome if you’re in a club, want to keep in touch with all your friends, or are trying organize something. Unfortunately, if you’re busy and the other members decide to have a long, detailed conversation about the latest episode of Game …

Django进阶之session

Django进阶之session 基于cookie做用户验证时&#xff1a;敏感信息不适合放在cookie中 session依赖cookie session原理 cookie是保存在用户浏览器端的键值对 session是保存在服务器端的键值对 session服务端中存在的数据为&#xff1a; session {随机字符串1&#xff1a;{用户…

Facebook开源 PyTorch版 fairseq,准确性最高、速度比循环神经网络快9倍

今年5月&#xff0c;Facebook AI研究院&#xff08;FAIR&#xff09;发表了他们的研究成果fairseq&#xff0c;在fairseq中&#xff0c;他们使用了一种新型的卷积神经网络来做语言翻译&#xff0c;比循环神经网络的速度快了9倍&#xff0c;而且准确性也是现有模型中最高的。此外…

推荐一个开源的现代化的 PDF 生成组件

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具和组件&#xff0c;希望对您有用&#xff01;前言QuestPDF 是一个开源免费的 .NET 组件库&#xff0c;可以用来生成 PDF 文档。在 Github 上有4千多的 Star。项目充分考虑了 PDF 文…

小程序调用阿里云身份证识别OCR(附带七牛云上传图片)

写在前面&#xff1a;实现的逻辑是拍照上传调用后端封装好的身份证接口&#xff0c;然后同时调用七牛云接口把照片传过去以便后台管理系统审核看1:首选需要这么一张页面接下来就写我是怎么做的首先是布局&#xff08;以下是wxml&#xff09; <view><view classidcard&…

史上最好记的神经网络结构速记表(上)

本文讲的是史上最好记的神经网络结构速记表&#xff08;上&#xff09;&#xff0c;新的神经网络结构不断涌现&#xff0c;我们很难一一掌握。哪怕一开始只是记住所有的简称&#xff08; DCIGN&#xff0c;BiLSTM&#xff0c;DCGAN &#xff09;&#xff0c;也会让同学们吃不消…