【每日算法】哈希表(Hash Table)

概述

哈希表又称散列表,它用于快速查找。

查找,如果能够不经过比较,直接就能得到待查记录的存储位置,那效率必定很高。

通过在记录的存储位置和它的关键码之间建立一个确定的对应关系H,使得每个关键码key跟唯一的存储位置H(key)对应,那么当我们想查找关键码为k的记录时,直接到H(k)处取即可。这种查找技术叫做散列技术

采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表,将关键码映射为散列表中适当存储位置的函数称为散列函数

散列主要是面向查找的数据结构,它不适用于范围查找(如找最大最小值、某一个范围内的值等等)。它最适合回答的问题是:如果有的话,哪个记录的关键码等于待查值。

散列表有一个问题:对于两个不同的关键码k1 != k2,有H(k1) = H(k2),即两个不同的记录需要存放在同一个存储空间中,这种现象称为冲突

散列技术需要考虑的两个主要问题:

  1. 散列函数的设计(力求简单、均匀、存储利用率高);
  2. 冲突的处理

散列函数

设计原则:

  • 计算简单(否则影响查找效率);
  • 函数值,即散列地址均匀分布(充分利用存储空间,减少冲突)。

直接定址

散列函数为关键码的线性函数:

H(key) = a * key + b (a、b为常数)

特点:单调、均匀,不会产生冲突;
适用于事先知道关键码的分布,且关键码集合不是很大而连续性号的情况。

实际不常用。

除留取余

H(key) = key mod p (p为正整数)

关键在于p的选取,一般情况下,若表长为m,通常选p为小于等于表长(最好接近m)的最小素数或与2的整数幂不太接近的质数或不包含小于20质因子的合数。

平方取中

平方取中法将关键码平方后,按散列表的大小,取中间的若干位作为散列地址。因为一个数平方后,中间几位分布较均匀,从而冲突发生的概率较小。

折叠法

折叠法将关键码从左到右分割成位数相等的几步分,最后一部分位数可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值