散列表的基本思想

在这里插入图片描述

序言

散列表是最快的查找数据的方法,没有之一,我们今天来简要介绍一下这个数据结构。

对散列表的基本认识

假设我们现在要存储五个人的身高。如下表

姓名身高
张三170
李四178
王五173
小明175
小红167

我们为这五个成绩创建了一个数组

typdef struct height_name{
	char name[];
	int height;
}height_structure;

height_structure array[5];

我们想要把这五个数据存放到这个数组里面,有人可能会说,挨个放进去就可以了,但是现在有一个问题,当我们挨个放进去之后,下次要取出的时候,我们只有一个名字,我们想通过这个名字来索引这个名字的身高,如何实现呢?这需要挨个进行比较,这是十分耗时的。我们不这样做,我们采取下图所示的存放思想来进行存放。
在这里插入图片描述
我们通过一个散列函数来将我们的数据的键(姓名)对应到数组的一个索引,并且将这个数据存储到这个索引在数组中对应的存储空间,这样我们下次给出姓名并通过散列函数便可以直接得到对应的数据在数组中的索引,然后直接从数组中读出这个数据来,所以散列表是就是一个带有散列函数的数组。但是有一个问题:存储空间是有限的,可能给出的关键字是无限的,如果多个关键字在散列函数的映射下对应到同一个索引,该怎么处理呢?这是一个很重要的问题。
在有了上面的基本思想之后,要建立一个散列表,我们需要做以下的事情:

  • 确定需要存储的数据类型,并为这些数据准备相应大小的数组
  • 确定散列函数(哈希函数)
  • 解决键冲突

确定散列函数的常用方法

  • 直接定址法
  • 数字分析法
  • 折叠法
  • 平方取中法
  • 减去法
  • 基数转换法
  • 除留余数法
  • 随机乘数法
  • 字符串数值哈希法
  • 旋转法
  • 伪随机数法

解决键冲突的常用方法

  • 分离链接法
  • 开放定址法
  • 再散列
  • 建立公共溢出区
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值