hash表学习笔记

一、hash表的基本概念和优缺点比较

hash表又称哈希表 ,是一种数据结构,与链表、二叉树有很大区别。

1、hash表优缺点

优点:能够在常数级的时间复杂度上进行查找,并且插入数据和删除数据简单。(Hash未满的时候速度很快)

缺点:不支持排序,一般比用线性表存储需要更多时间,并且记录的关键字不能重复

2、与链表比较

链表:查询上表中的数据从头开始遍历,直到查到或者查找失败。

hash:根据存储数据特定关键字,然后根据关键字直接查询想要得到数据。

hash存储位置通常称作Hash地址。

Hash地址是由关键字经过特定的 hash函数运算得到。

3、当关键字重复就会产生数据冲突。

二、hash表的构造方法

1、直接定址法

例如:有一个从1到100岁的人口数字统计表,其中,年龄作为关键字,哈希函数取关键字自身。

但这种方法效率不高,时间复杂度是O(1),空间复杂度是O(n),n是关键字的个数

eg:f(x) = 5x+10

x代表的就是年龄,而f(x)获取到的就是对应地址,是取Hash地址与关键字构成的线性函数。

2、平方取中法

适用关键字是数字的情况,将关键字平方然后取其中间的几位作为Hash地址。

3、数字分析法

比如同龄人的出生年月,由于前几位数字的重复几率较大,所以造成冲突的几率较高,所以尽量不取前几位。

4、折叠法

将关键字分割成相同的几段数字(最后一部分可以不同),然后将得到的几段数字叠加(进位舍去)作为Hash地址,折叠法

eg:每一种西文图书都有一个国际标准图书编号,它是一个10位的十进制数字,若要以它作关键字建立一个哈希表,

如果一本书的编号为1234-5678-321,可以将其分为{12,34,56,78,32,1}。而Hash地址则是这几个数之和。

5、除留取余法

如果知道Hash表的最大长度为m,可以取不大于m的最大质数p,

然后对关键字进行取余运算,f(x) = x%p。

在这里p的选取非常关键,p选择的好的话,能够最大程度地减少冲突,

p一般取不大于m的最大质数。

6、随机数法

选择一个随机函数,取关键字的随机函数值为它的哈希地址,即

f(x)=random(x) ,其中random为随机函数。通常用于关键字长度不等时采用此法。

三、冲突处理

1、开放定址法

关键字冲突时,使用某种探测技术在Hash表中形成一个探测序列,然后沿着这个探测序列依次查找下去,

当碰到一个空的单元时,则插入其中。

eg:一组关键字{13,25,23,38,34,6,84,91},

Hash表长为14,Hash函数为f(x)=x%11,当插入13,25时可以直接插入,而当插入23时,地址1被占用了,

因此沿着地址1依次往下探测(探测步长可以根据情况而定),直到探测到地址3,发现为空,则将23插入其中。

2、再哈希法

当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。

3、链地址法

采用数组和链表结合的方式,HashMap中就是采用这种方式存储Hash地址,原理是将Hash地址(经过关键字计算的值)相同的记录存在同一个链表中,

而每张表的表头序号就是新的Hash地址。

4、建立一个公共溢出区

假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。

参考博文:http://www.cnblogs.com/dolphin0520/archive/2012/09/28/2700000.html

时间: 2024-08-06 14:35:35

hash表学习笔记的相关文章

Unity3d之Hash&Slash学习笔记之(二)--角色基础类的构建

Hash&Slash学习笔记之(二)--角色基础类的构建 BaseStat类的构建 基本成员变量: _baseValue //基础属性值 _buffValue //增加的buff值 _expToLevel //升级所需经验值 _levelModifier //每一级的增长率,即下一等级所需经验为_expToLevel*_levelModifier 成员函数: private int CalculateExpToLevel(){ //计算下一级升级所需经验 return (int)(_expToL

Servlet乘法表学习笔记

一.控制台实现乘法表 package com.shanrengo; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServle

Unity3d之Hash&Slash学习笔记(一)--角色属性类的构架

角色属性类的构架 角色属性类有8个类,继承关系如下图: 每个类的具体作用见之后的随笔 Unity3d之Hash&Slash学习笔记(一)--角色属性类的构架

windows注册表学习笔记

注册表,想起来了就学学,方便操作.无需把它当成重要学问,今日就学一波,作为了解. 一.注册表清理脚本 主要是删除临时文件,旧文件.并不能够删除无效的键 @echo off del/f/s/q %systemdrive%\*.tmp del/f/s/q %systemdrive%\*._mp del/f/s/q %systemdrive%\*.log del/f/s/q %systemdrive%\*.gid del/f/s/q %systemdrive%\*.chk del/f/s/q %sys

《Oracle完全学习手册》 表空间&管理控制文件与日志文件&表 学习笔记

表空间 表空间是Oracle数据结构中最大的逻辑结构 基本表空间 临时表空间:排序.汇总过程中产生的临时数据 大文件表空间:存储大型数据 非标准数据块表空间 撤销表空间:存储撤销数据 基本表空间 创建一个名为TEMP0301的表空间 create tablespace temp0301 datafile 'F:\SQL\use0301.dbf' size 20m autoextend on next 10m maxsize unlimited; create tablespace temp030

监听器-启动会初始化表 学习笔记:

遇到问题: 数据库连接问题:后面采用固定写法: 解决问题 /**c3p0取得数据源*/ public static DataSource getDataSource() throws Exception { ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setDriverClass("com.mysql.jdbc.Driver"); cpds.setJdbcUrl("jdbc:mysql://19

嵌套循环 99乘法表 学习笔记

class TestJiuJiu  { public static void main(String[] args)  { for(int i =1; i<=9; i++){ for(int j = 1; j<=i; j++ ){ System.out.print(i+"*"+j+"="+ i*j +"\t" ); } System.out.println(); } } }

sqlite学习笔记8:C语言中使用sqlite之创建表

前面已经说了如何打开和关闭数据库,这次要说得是如何执行SQL语句,来创建一张表. 要用的的函数: sqlite3_exec(sqlite3* db, const char *sql, sqlite_callback callback, void *data, char **errmsg) 参数: db:已经打开的数据库实例 sql:SQL语句,是一个字符串 callback:是一个回调函数 data:做为回调函数的第一个参数 errmsg:用于带回错误信息 该回调函数有两种返回值类型. 1.返回

Unix文件系统学习笔记之二: 文件描述符、inode和打开文件表

Unix文件系统学习笔记之二: 文件描述符.inode和打开文件表 系统盘上数据的布局 文件系统无非是关于数据在磁盘上的组织以及存储空间管理的,为此,首先需要知道磁盘上数据的总体布局方式.以Unix为例,最重要的一张表如下: Unix 进程管理中和用户文件.io 最相关的数据结构:usr 数据结构 The procstructure does not record information related to file access.  However the userstructure con