数据结构---哈希表

本文介绍了哈希表的概念及其在数据查找和排序中的应用。通过使用哈希表,可以快速定位数组中的元素,实现查找操作。当数据范围较小且固定时,可以直接用数组作为哈希表,否则需要设计哈希函数。哈希冲突是常见的问题,解决方法包括线性探测和拉链法。文章深入探讨了如何利用哈希思想对大规模数据进行排序,并讨论了处理复杂数据类型的哈希策略。
摘要由CSDN通过智能技术生成

简单介绍

  1. 哈希表 Hash table也称为散列表,它是可以根据关键字的值直接进行查询与访问的数据结构,我们通常通过映射函数将关键字直接对应到表中的某个位置,加快查找速度,这个映射函数叫做哈希函数。存放记录的数组叫哈希表

引出问题

  1. 从包含n个整数的数组a中查找整数key,存在返回1,否则返回0。用最朴素的方法就是循环遍历查找。

使用哈希表

  1. 加入要查找的数据范围是0到99并且类型是整型,这种情况可以直接使用数组下标来记录元素是否出现,这就是最简单的哈希思想
    在这里插入图片描述
    如上图,我们用一个初始化元素都为0的table数组记录a数组中所出现元素,例:a数组中第一个元素是7,那么我们就在table数组下标7的位置加1,依次往后。通过这种方法我们不仅可以用来查找,还能用来排序。

用哈希的思想实现排序

举个例子:如果数组a中有n个元素,n非常大,比如达到100W,但a中数据的取值范围非常小,比如从0到99,那么通过0到99长度的table,记录a中每个元素出现的次数,由于table[i]代表了数据i出现的次数,在排序时,从0到MAX_TABLE_LEN循环i,再将table[i]个i添加到a中就可以了。
在这里插入图片描述
但如果数组a中的数据范围不是0到99,而是int型的2的31次方或者是浮点数、字符串、甚至是数组、对象等等更复杂的元素应该怎么处理呢?这时就需要使用哈希函数了。
我们将待存储的数据转换为表长范围内的整数,然后再使用数组下标进行访问,对于整数数据可以直接取余表长,得到对应的哈希值,如果是字符串需要专门的设计哈希函数,最简单的比较遍历字符串中的字符,将它们的ASC2码相加得到整数,再取余表长得到哈希值。
例如:如果要将523插入到长度为100的table中,令523取余100得23,再将table[23]加1,那么table的下标23就记录了523这个数字。字符串abc的ASC2码分别是97 98 99,将它们相加得294取余100是94,那么table[94]就记录了abc是否出现。
在这里插入图片描述
哈希函数可能将不同的数据映射到同一个数组下标上,这样就发生了冲突
在这里插入图片描述
那么又应该如何解决哈希表的冲突问题呢?例如线性探测、拉链法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值