Hash小结

原创 2016年08月31日 16:35:39

定义

Hash也叫散列,任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

通过把关键码值映射到表中一个位置来访问记录,有点类似于数组,并且能在O(1)(冲突情况另算)下查找到元素。

Hash函数

  • 直接取余法:取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址。该方法的关键是选取p。选取的p应使得散列函数值尽可能与关键字的各位相关。p最好为素数

  • 直接寻址法:比如在一个0~100岁的年龄统计表,我们就可以把年龄作为地址

  • 平方取中法:6031,平方后为8位数字36372961,取中间的4位数字,3729。因为一个乘积的中间几位数和乘数的每一位都相关,所以由此产生的散列地址较为均匀。

  • 随机数法:选择一个随机函数,取关键字的随机函数值为它的散列地址,即h(key)=random(key)

  • 数字分析法 :根据关键码每一位的分布情况,选取某几位,组合成散列地址。所选的位应是r种符号在该位上出现的频率大致相同

  • 乘法取整法:Hash(key)=B*(A*key%1);以关键码key*A,取其小数部分(A*key%1就是取A*key的小数部分),之后再用整数B乘以这个值,取结果的整数部分作为散列地址

解决冲突

  • 开放定址法:用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止。(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元;查找时探查到开放的 地址则表明表中无待查的关键字,即查找失败)

  • 拉链法 : 拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中

  • 再散列法:在产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间。

  • 建立公共溢出区法

版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构基础-Hash Table详解

理解Hash 哈希表(hash table)是从一个集合A到另一个集合B的映射(mapping)。 映射是一种对应关系,而且集合A的某个元素只能对应集合B中的一个元素。但反过来,集合B中的一个元素...
  • liufei_learning
  • liufei_learning
  • 2014年02月15日 01:47
  • 12889

实现哈希桶(空间利用率较高的哈希表)

前面几篇博客已经写过了哈希表的闭散列法,也写过哈希表的应用,在这里就不赘述。今天我们要实现的是一个哈希桶。什么哈希桶呢?哈希桶:哈希桶就是盛放不同key链表的容器(即是哈希表),在这里我们可以把每个k...
  • leex_brave
  • leex_brave
  • 2016年05月24日 15:28
  • 6656

【Redis笔记(三)】 Redis数据结构 - hash哈希

在上一篇文章中【Redis笔记(二)】 Redis数据结构-string字符串中,我们学习了Redis最基本的数据结构string,今天我们的主角是 – hash(哈希)类型。hash类型介绍hash...
  • Xiejingfa
  • Xiejingfa
  • 2016年01月20日 20:15
  • 4964

Java学习IO流小结--字节流

  • 2015年07月11日 14:59
  • 218KB
  • 下载

CSS小结有关整体

  • 2014年10月25日 19:31
  • 36KB
  • 下载

蜂鸣器小结1

  • 2012年11月08日 21:58
  • 278B
  • 下载

MM4小结 MM4机器测试步骤

  • 2013年12月09日 21:20
  • 1.75MB
  • 下载

VB编程经验小结doc

  • 2014年07月21日 03:12
  • 537KB
  • 下载

HTML小结文档

  • 2013年07月29日 14:58
  • 42KB
  • 下载

Struts2知识点小结-非常实用

  • 2010年05月17日 14:49
  • 151KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hash小结
举报原因:
原因补充:

(最多只允许输入30个字)