哈希(Hash)表

原创 2012年03月23日 11:00:29
哈希(Hash)表

    一般的查找方法是基于比较的方法,查找效率依赖比较次数,其实理想的查找是希望不经比较,一次存取便能得到所查记录。这样就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,查找k时,只要根据这个对应关系f找到给定值k的像f(k)。这种对应关系f叫哈希(hash)函数。按这种思想建立的表叫哈希表(也叫散列表)。

    哈希表存取方便但存储时容易冲突(collision):即不同的关键字可以对应同一哈希地址。如何确定哈希函数和解决冲突是哈希表查找的关键。

    1.哈希函数的构造方法

    构造哈希函数的方法有很多,这里介绍几种常用的。

直接定址法:H(k)=k 或H(k)=a*k+b(线形函数)

如:人口数字统计表

地址 1 2 3 ... 100
年龄 1 2 3 ... 100
人数 67 3533 244 ... 4

数字分析法:取关键字的若干数位组成哈希地址

如:关键字如下:若哈希表长为100则可取中间两位10进制数作为哈希地址。  

81346532 81372242 81387422 81301367 81322817 81338967 81354157 81368537

平方取中法:关键字平方后取中间几位数组成哈希地址

折叠法:将关键数字分割成位数相同的几部分(最后一部分的位数可以不同)然后取几部分的叠加和(舍去进位)作为哈希地址。

除留余数法:取关键字被某个不大于表长m的数p除后所得的余数为哈希地址。

           H(k)=k mod p  p<=m

随机数法:H(k)=rondom(k)。

 

    2.处理冲突的方法

    假设地址集为0..n-1,由关键字得到的哈希地址为j(0<=j<=n-1)的位置已存有记录,处理冲突就是为该关键字的记录找到另一个"空"的哈希地址。在处理中可能得到一个地址序列Hi i=1,2,...k 0<=Hi<=n-1),即在处理冲突时若得到的另一个哈希地址H1仍发生冲突,再求下一地址H2,若仍冲突,再求H3...。怎样得到Hi呢?

开放定址法:Hi=(H(k)+di) mod m  (H(k)为哈希函数;m为哈希表长;di为增量序列)

当di=1,2,3,... m-1 时叫线性探测再散列。

当di=12,-12,22,-22,32,-32,...,k2,-k2时叫二次探测再散列。

当di=random(m)时叫伪随机探测序列。

例:长度为11的哈希表关键字分别为17,60,29,哈希函数为H(k)=k mod 11,第四个记录的关键字为38,分别按上述方法添入哈希表的地址为8,4,3(随机数=9)。

再哈希法:Hi=RHi(key) i=1,2,...,k,其中RHi均为不同的哈希函数。

链地址法:这种方法很象基数排序,相同的地址的关键字值均链入对应的链表中。

建立公益区法:另设一个溢出表,不管得到的哈希地址如何,一旦发生冲突,都填入溢出表。

 

    3.哈希表的查找

例:如下一组关键字按哈希函数H(k)=k mod 13和线性探测处理冲突所得的哈希表a[0..15]:

 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  14 01 68 27 55 19 20 84 79 23 11 10      

当给定值k=84,则首先和a[6]比,再依次和a[7],a[8]比,结果a[8]=84查找成功。

当给定值k=38,则首先和a[12]比,再和a[13]比,由于a[13]没有,查找不成功,表中不存在关键字等于38的记录。

MySQL表分区(3)哈希分区-hash

哈希分区。哈希分区主要是依据表的某个字段以及指定分区的数量。 create table user (   id int(20) not null,   role varchar(20) not nul...
  • oh_Mourinho
  • oh_Mourinho
  • 2016年08月05日 15:08
  • 2241

Oracle 什么叫哈希表(Hash Table)

Oracle 什么叫哈希表(Hash Table)     - 散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速...
  • haiross
  • haiross
  • 2014年03月16日 19:45
  • 3111

oracle表连接----->哈希连接(Hash Join)

oracle表之间的连接之哈希连接(Hash Join),其特点如下: 1,驱动表和被驱动表都是最多只被访问一次。 2,哈希连接的表有驱动顺序。 3,哈希表连接的表无需要排序,但是他在做连接之前做哈希...
  • waterxcfg304
  • waterxcfg304
  • 2014年05月15日 14:13
  • 14527

哈希链表及其变种

本文主要分析哈希链表(hash list)的设计原理和实现,以及哈希链表的一种变种(hash nulls list)的原理和实现。...
  • zhangskd
  • zhangskd
  • 2013年09月09日 18:34
  • 9585

多阶hash表

关于多阶hash表的具体代码实现,请移步到:《使用共享内存的多级哈希表的一种实现》http://webcache.googleusercontent.com/search?q=cache:GEiOey...
  • wm_1991
  • wm_1991
  • 2016年08月16日 11:37
  • 1383

Oracle分区表,哈希分区的新建与增加

一、背景知识 Oralce中的一张表数据量达到亿数量级后或是单表达到2G大小,查询效率似乎会明显下降。需要通过分区的方式,从行的维度对表进行划分,避免单表数据量过大 分区方法有下面几类: 范...
  • xiaoxing1521025
  • xiaoxing1521025
  • 2013年09月27日 16:32
  • 1260

oracle点知识8——索引聚簇和哈希聚簇

原文整理自网络: Oracle支持两种类型的聚簇: 索引聚簇和哈希聚簇 1. 什么是聚簇 聚簇是根据码值找到数据的物理存储位置,从而达到快速检索数据的目的。聚簇索引的顺序就是数...
  • changyanmanman
  • changyanmanman
  • 2012年03月11日 20:52
  • 1116

中文分词系统之-导入文本文件类词库建立哈希表索引-JAVA源码

/*/*分词系统的词典导入的接口类,主要实现文本文件中词典的导入,及创建哈希表。且实现初步的哈希表关键字查询*输入参数:Iter...
  • Qonfire
  • Qonfire
  • 2007年11月12日 18:18
  • 1857

彩虹表与带盐Hash

彩虹表与带盐哈希   彩虹表(Rainbow Table) 1 What? 彩虹表就是一个庞大的、针对各种可能的字母组合预先计算好的哈希值的集合。  【注】只针对MD5算法?No,可以有各种...
  • the__blue__sky
  • the__blue__sky
  • 2015年10月28日 01:40
  • 2705

oracle 表连接 - hash join 哈希连接

一. hash 连接(哈希连接)原理 指的是两个表连接时, 先利用两表中记录较少的表在内存中建立 hash 表, 然后扫描记录较多的表并探测 hash 表, 找出与 hash 表相匹配的行来得到结果...
  • dataminer_2007
  • dataminer_2007
  • 2014年12月18日 18:13
  • 2180
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:哈希(Hash)表
举报原因:
原因补充:

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