散列查找

2 篇文章 0 订阅
1 篇文章 0 订阅

散列查找

1. 散列的定义:

散列,就是Hash,把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
从以上的定义中,可以提取出2条重要信息:一是散列就是数学中的映射,二是散列发结果可能产生冲突,不能通过散列结果反过来查找输入值。

2. 常见的散列函数:

设计散列函数主要考虑的问题就是怎么减少冲突。对于不同的应用,有不同的合适的散列函数,这里只介绍一种常见的散列函数-----取余法。

取关键字被数p除后所得余数为哈希地址:H(key)=key MOD p (p≤m)
这是一种最简单,也最常用的构造哈希函数的方法。它不仅可以对关键字直接取模(MOD),也可在折迭、平方取中等运算之后取模。值得注意的是,在使用除留余数法时,对p的选择很重要。一般情况下可以选p为质数或不包含小于20的质因素的合数。

3. 冲突处理

散列的过程中不可避免的会产生冲突,下面介绍2种处理冲突的方法:

1)开放定值法

基本思想:将所有结点均存放在散列表[0…m-1]中。当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址 (即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的地址则表明表中无待查的关键字,即查找失败。

2) 链地址法

基本思想:将互为同义词的结点链成一个单链表,而将此链表的头指针放在散列表[0…m-1]中。

例:已知一组关键字为(19,14,23,01,68,20,84,27,55,11,10,79),则按哈希函数H(key)=key MOD13和链地址法处理冲突构造所得的哈希表为:

这里写图片描述
最后讨论一下散列查找的效率:把key进行散列的时间复杂度为:O(n),进行查找的复杂度为O(n)。最后时间复杂度为O(n)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值