哈希表详解

最近在做负荷分担的优化,将数据流均匀分到八条流中,学习点哈希算法

什么是哈希表?
     哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。说白了哈希表的原理其实就是通过空间换取时间的做法。。
     哈希表的做法其实很简单,就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。
     而当使用哈希表进行查询的时候,就是再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value,如此一来,就可以充分利用到数组的定位性能进行数据定位。。

哈希函数的构造方法:

若对于关键字集合中的任一个关键字,哈希函数映像到地址集合中任何一个地址的概率是相等的,则称此类哈希函数为均匀的哈希函数。换句话说,就是使关键字经过哈希函数得到一个“随机的地址“,以便使一组关键字的哈希地址均匀分布在整个地址区间中,从而减少冲突。
(1)直接定址法
  取关键字或关键字的某个线性函数值为哈希地址。即: H(key)=key或H(key)=a*key+b; 其中a和b为常数(这种哈希函数叫做自身函数)。
由于直接定址所得地址集合和关键字集合的大小相同。因此,对于不同的关键字不会发生冲突。但实际中使用这种哈希函数的情况很少。
(2)数字分析法
  假设关键字是以r为基的数(如:以10为基的十进制数),并且哈希表中可能出现的关键字都是事先知道的,则可取关键字的若干数位组成哈希地址。
(3)平方取中法
  取关键字平方后的中间几位为哈希地址。
(4)斐波那契(Fibonacci)散列法
     平方散列法的缺点是显而易见的,所以我们能不能找出一个理想的乘数,而不是拿value本身当作乘数呢?答案是肯定的。
     1)对于16位整数而言,这个乘数是40503 
     2)对于32位整数而言,这个乘数是2654435769 
     3)对于64位整数而言,这个乘数是11400714819323198485
     这几个“理想乘数”是如何得出来的呢?这跟一个法则有关,叫黄金分割法则,而描述黄金分割法则的最经典表达式无疑就是著名的斐波那契数列,即如此形式的序列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,…。另外,斐波那契数列的值和太阳系八大行星的轨道半径的比例出奇吻合。
     对我们常见的32位整数而言,公式: index = (value * 2654435769) >> 28
(5)折叠法
  将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址,这方法称为折叠法。
(6)除留余数法(==最常用的方法)
  取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址。即H(key)=key MOD p,(p<=m),这是一种最简单,也是最常用的构造哈希函数的方法。它不仅可以对关键字直接取模(MOD),也可在折叠、平方取中等运算之后取模。
(7)随机数法
  选择一个随机函数,取关键字的随机函数值为它的哈希地址,即H(key)=random(key),其中random为随机函数。通常,当关键字长度不等时采用此法构造哈希函数较切当。
总结:
  实际工作中需视不同情况采用不同的哈希函数,通常,考虑的因素有:
  (1)计算哈希函数所需时间(包括硬件指令的因素);
  (2)关键字的长度;
  (3)哈希表的大小;
  (4)关键字的分布情况;
  (5)记录的查找频率。

处理冲突的方法(冲突只能减少,不能避免):
  (1)开放定址法
  (2)再哈希法
  (3)链地址法
  (4)建立一个公共溢出区
哈希表的查找及其分析:
  在哈希表上进行查找的过程和哈希造表的过程基本一致。给定的K值,根据造表时设定的哈希函数求得哈希地址,若表中此位置上没有记录,则查找不成功;否则必将关键字,若和给定的值相等,则查找成功;否则根据造表时设定的处理冲突的方法找”下一地址“,直至哈希表中的某个位置为”空“或者表中所填记录的关键字等于给定值时为止。 
  哈希表的装填因子定义为:
                               α=(表中填入的记录数)/(哈希表的长度)

时间: 2024-10-10 20:41:31

哈希表详解的相关文章

[转]PostgreSQL教程:系统表详解

这篇文章主要介绍了PostgreSQL教程(十五):系统表详解,本文讲解了pg_class.pg_attribute.pg_attrdef.pg_authid.pg_auth_members.pg_constraint.pg_tablespace.pg_namespace.pg_database等表的作用和字段介绍,需要的朋友可以参考下 一.pg_class: 该系统表记录了数据表.索引(仍然需要参阅pg_index).序列.视图.复合类型和一些特殊关系类型的元数据.注意:不是所有字段对所有对象

oracle中的dual表详解

oracle中的dual表详解 1.DUAL表的用途 Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中 --查看当前连接用户 SQL> select user from dual; USER ------------------------------ SYSTEM --查看当前日期.时间 SQL> select sysdate from dual; SYSDATE ----------- 2007-1-24 1 SQL> sele

Oracle外部表详解(转载)

(外部表创建主要注意创建目录访问权限问题.目录路径格式无空格等不相关字符,即必须是当前表访问用户可以访问:关于表中行数的限制问题,如果不加限制注意添加reject limit unlimited:表中数据格式与创建表时access parameters中的定义需保持同步,适当用skip=1) 外部表概述 外部表只能在Oracle 9i之后来使用.简单地说,外部表,是指不存在于数据库中的表.通过向Oracle提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数据库表,就像这些数据存储

ABAP 内表 详解

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4293475.html 老式的内表类型定义... 214 基于基本类型内表类型... 214 基于结构体类型内表类型... 215 老式的内表对象创建... 215 参照现有内表类型或内表对象来创建... 215 参照现有结构类型或结构对象来

ecmall数据库表详解 二次开发必备

文章分类表ecm_acategory 字段 类型 Null 默认 注释 cate_id int(10) 否   自增ID号,分类ID号 cate_name varchar(100) 否   分类的名称 parent_id int(10) 否   分类的父级ID sort_order Tinyint(3) 否   分类排序数字标识 code varchar(10) 否   分类的代码标识 用户地址表(ecm_address) 字段 类型 Null 默认 注释 addr_id int(10) 否  

wordpress数据库表详解

表名:wp_categories 用于保存分类相关信息的表.包括了5个字段,分别是: 字段 注释 cat_ID 每个分类唯一的ID号,为一个bigint(20)值,且带有附加属性auto_increment. cat_name 某个分类的名称,为一个varchar(55)值. category_nicename 指定给分类的一个便于记住的名字,也就是所谓的slug,这是一个varchar(200)值 category_description 某个分类的详细说明,longtext型值. categ

MySQL user表详解

Host: 10-4-13-72 User: Password: Select_priv: N Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Reload_priv: N 重新加载权限表 Shutdown_priv: N Process_priv: N 服务器管理 File_priv: N 加载服务器上的文件 Grant_priv: N References_priv: N Index_priv:

万象数据库表详解

万象数据库表wx2004数据库的用户表有tActCard.tAdd.tBackFileNames.tBackPlan.tBook.tDebt.tDiffer.tEvents.tExchange.tExport.tFilling.tFreeze.tGoodsTmp.tTtems.tLogin.tLogs.tempStatistic tOtherFee.tPort.TRet.tSales.tShift.tStat.tStock.tSyncStock.tTmpAdd.tTmpCard.tUsers总共

SQL Server时间粒度系列----第7节日历数据表详解

本文目录列表: 1.时间粒度有关描述 2.时间维度有关功能函数3.日历数据表 4.日历数据表数据填充 5.总结语 6.参考清单列表 时间粒度有关描述   将该系列涉及到的时间粒度以及分钟以下的粒度做个总结,如以下表格: 时间粒度                 纳秒                 微妙                 毫秒                 秒                 分钟 日期分钟数(整数)* 日期分钟* 日内分钟数           小时 日期小时数