数据结构(八):散列表

散列的基本思想假设有N对键值对需要存储,且所有的键都是互不相同的小整数,则可以使用一个大小为M的数组存储这些键值对,其中数组的长度M要大于所有键中的最大值。这样,在存储的时候,可以直接用键key作为数组的索引,该索引对应的位置存放的就是key相对应的值value。由于所有键相互之间可能并不是连续的,所以数组中有些位置可能是空的,没有存储值,相当于有一些内存被浪费了。但是,采用此种方式存储数...
摘要由CSDN通过智能技术生成

散列的基本思想

假设有N对键值对需要存储,且所有的键都是互不相同的小整数,则可以使用一个大小为M的数组存储这些键值对,其中数组的长度M要大于所有键中的最大值。这样,在存储的时候,可以直接用键key作为数组的索引,该索引对应的位置存放的就是key相对应的值value。

由于所有键相互之间可能并不是连续的,所以数组中有些位置可能是空的,没有存储值,相当于有一些内存被浪费了。但是,采用此种方式存储数据,读写数据时就可以通过key作为索引直接定位到数组中相应的位置,使耗费的时间为常数级别。

下面是一个简单的例子,有5个键值对需要存储,键为小整数,值为字符串,如图所示。存储数据的数组大小为10。通过相应的键作为索引将值存储到数组中的示意图如下。

如果存储的一系列键都是不同的小整数(确保可以直接将键key作为数组索引),而且从0开始具有较大的连续性(使数组中空闲位置较少),则可以采取上面的方法存储数据,以占用稍大的内存为代价换取更快的常数级别的数据读写时间。

上面所述就相当于是一个简单的散列表,散列表的大小M就是数组的长度。然而,上面的假设是一种理想的情况。通常我们需要存储的键值对的键key并不是小整数,甚至并不是一个整数,而更可能是一个字符串,是某个类的某个对象,等等。为了能够采用以上的存储方法,首先就需要将可能是各种各样类型的key转换为一个较小的整数。这个转换的过程就叫做散列,将非整数类型的key转换为整数类型的一个函数称为散列函数。

下面假设仍然有N对键值对需要存储,键key的类型为字符串,为了能够采用以上的存储方法,首先就要将每个键key通过散列函数散列为一个较小的整数。而且,若散列表的大小即数组的长度为M,为了使散列得到的整数能够直接作为数组的索引,则要求散列得到的整数的范围为[0,M)。

当N<M时,比如N为5,M为10,即散列表的大小为10,需要存储的键值对数量为5时,通过某一个散列函数,分别将5个key散列为了5个不同的[0, 10)范围内的整数,例如5个key的散列值分别为2,0,5,3,7,则可以顺利的将对应的值value存入数组中相应的位置,这就和前面第一个例子一样。

但是,如果散列函数选取不合适,在散列的过程中有可能会发生一件不幸的事情,即由于散列不均匀而造成冲突碰撞。依然以上面的例子为例࿰

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值