拉链法解决哈希冲突

2024-04-28 03:44
文章标签 解决 哈希 冲突 拉链

本文主要是介绍拉链法解决哈希冲突,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.基本思想:

相同散列地址的记录链成一单链表,m个散列地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构.
例如:一组关键字为{19,14,23,1,68,20,84,27,55,11,10,79},散列函数为:Hash(key)=key%13,
就会发现有些元素是同义词,比如14%131,1%131,27%13==1,14,1,27是同义词

image-20230701205710018.png


上图有一个缺点,我们最好能用头插法建立哈希表,头插法速度快,时间复杂度O(1)
最多有m个单链表,编号为0-m-1,用一个数组将m个单链表的表头指针存起来.

那么接下来我们就要依据我们的散列函数来建立我们的哈希表,那么我们开始写代码,主要是先设计结构,然后建立哈希表和查找哈希表.

2.代码实现

//链地址法:
{return key % m;
}//在哈希表中查找key,找到返回节点地址,失败返回NULL
Node* Search(const HashTable ht, int key)
{int hi = H(key);//计算key的哈希值for (Node* p = ht[hi].next; p != NULL; p = p->next){if (p->data.key == key){return p;}}return NULL;
}//将key插入到哈希表ht中,成功返回true,失败返回false
bool  Insert(HashTable  ht, int key)
{int hi = H(key);if (Search(ht, key) != NULL)//key已经存在{return false;}//插入keyNode* p = (Node*)malloc(sizeof(Node));//创建新节点assert(p != NULL);p->data.key = key;//头插p->next = ht[hi].next;ht[hi].next = p;return true;
}//从头到尾输出ht的所有值
void   Show(HashTable ht)
{for (int i = 0; i < m; i++){printf("哈希值为%d的有:", i);for (Node* p = ht[i].next; p != NULL; p = p->next)//遍历当前哈希值的链表{printf("%d   ", p->data.key);}printf("\n");}
}int  main()
{HashTable ht;InitHashTable(ht);int arr[16] = { 3,5,7,1,2,9,28,25,6,11,10,15,17,23,34,19 };for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)//利用arr构造哈希表ht{Insert(ht, arr[i]);}Show(ht);Node* p;for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)//查找所有的arr{p = Search(ht, arr[i]);p == NULL ? printf("%d没有找到\n", arr[i]) : printf("%d找到了\n", arr[i]);}printf("\n");p = Search(ht, 100);p == NULL ? printf("%d没有找到\n", 100) : printf("%d找到了\n", 100);return 0;
}

这篇关于拉链法解决哈希冲突的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/942253

相关文章

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

springboot报错Invalid bound statement (not found)的解决

《springboot报错Invalidboundstatement(notfound)的解决》本文主要介绍了springboot报错Invalidboundstatement(not... 目录一. 问题描述二.解决问题三. 添加配置项 四.其他的解决方案4.1 Mapper 接口与 XML 文件不匹配

Python中ModuleNotFoundError: No module named ‘timm’的错误解决

《Python中ModuleNotFoundError:Nomodulenamed‘timm’的错误解决》本文主要介绍了Python中ModuleNotFoundError:Nomodulen... 目录一、引言二、错误原因分析三、解决办法1.安装timm模块2. 检查python环境3. 解决安装路径问题

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错