`
緣自秋淚
  • 浏览: 11760 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

哈希表的理解和实现

 
阅读更多

哈希表,也叫散列表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。

在此我不谈各种权威对哈希表的定义,仅谈自己的理解,因此难免有错误和不足之处。用个具体的例子来阐述我对哈希表的理解。例子虽然有些陈旧,但是不影响理解。现有一个班,班上30名同学,假设都是同一年出生的,那么某些同学有同样生日的可能性是多少呢?生日可以是365天中的任意一天(暂不考虑闰年),大多数班级中的学生没有相同生日的,但是学生越多,具有相同生日的可能性就越大。把学生根据生日映射到日期类似于使用生日作为哈希函数,把记录分配到表的槽中(大小是365),那么,这就相当于一个哈希表。

而事实上,一个槽只应该放一个数据,但是当哈希函数算得的值h(key1)==h(key2)时,两个不同的关键字对应的哈希地址相同,于是就产生了冲突,好的哈希函数只能避免冲突,不能完全消除冲突。好的散列函数特点是:(近似的)满足简单一致散列,即对于关键字集合U中的任何一个关键字,经散列函数映射到地址集合中任何一个地址的概率是相等的,此时可以称为均匀散列函数,也就是说使关键字经过散列函数得到一个随机的地址,以便使一组关键字的散列地址均匀分布在整个地址区间,减少冲突。

冲突是必然的,那么,该如何处理冲突,有以下几种常见的方法:开放寻址法,再散列法,链地址法,建立一个公共溢出区等。在自己实现哈希表的时候,我用的处理冲突的方法是链地址法,所以在此着重介绍此法。

链地址法,简单地说,就是把散列到同一个槽中的所有元素都放在一个链表中。相对于开放地址法,可能会增加存储空间。但是便于查找。实现检索的时候,先用哈希函数算得哈希地址,如果没有冲突,直接使用该处的值,如果有冲突,此处会是一个链表,在遍历链表来找到想要的值。采用这种方法时,数组的初始大小,加载因子(已装的数据与数组初始大小的比例)及哈希函数的好坏就尤为重要了。因为此种情况下会产生两个极端,一个极端就是数据很少,加载因子小,哈希表显得很“空旷”,于是哈希表就成了一个数组;另一种情况是加载因子较大,数据很多,冲突也很多,导致挂下长串的链表,这时哈希表就成了链表。这样的设计都是不合理的。当然,随着数据的增多,冲突肯定会变多,哈希表就会显得“拥挤”,这就涉及到了另一个概念,Rehash

Rehash,简单地说就是重新创建哈希表,将原来的数据重新装入新的哈希表。一般情况下,新建的哈希表的大小会比原来的大一些,但是不会大太多,同时哈希函数也换新的,那么原来数据在表中的位置就发生了变换。Java中系统自带的哈希表是当加载因子大于0.75时就会进行Rehash。当然在自己实现的时候这个值是可以改变的。

我目前实现的哈希表的功能,可以往表中放数据(Key value),根据Key值和哈希函数得出哈希地址。当发生冲突时,采用挂链表的方法解决,检索的时候根据Key值算出的地址得到所有在该地址中的数据。Rehash的实现还在进一步努力中。鉴于我的代码及实现的哈希函数等都是较“低端的”,在此就不贴代码献丑了。

分享到:
评论

相关推荐

    利用C++哈希表的方法实现电话号码查询系统

    利用C++哈希表的方法实现电话号码查询系统 如何运用哈希表的算法 深刻理解哈希表 利用C++哈希表的方法实现电话号码查询系统 如何运用哈希表的算法 深刻理解哈希表

    哈希表对本班同学进行哈希排序

    自己写的关于哈希表的代码。实现对本班同学的姓名进行哈希排序,查找。还有待完善。。不过能运行带注释好理解。希望给初学者带来帮助

    C++ 实现哈希表的实例

    主要介绍了C++ 实现哈希表的实例的相关资料,这里使用C++实现哈希表的实例帮助大家彻底理解哈希表的原理,需要的朋友可以参考下

    哈希表实例源码

    使用c语言实现了hashtable算法,可以用来作为新手学习,理解hashtable。理解linux内核中使用的hashtable

    编程语言(C++/Python/C#/javascript)中的数据结构——哈希映射

    有两种不同类型的哈希表:哈希集合(理解为set)和哈希映射(理解为dictionary)。 哈希集合是集合数据结构的实现之一,用于存储非重复值。 哈希映射是映射数据结构的实现之一,用于存储(key, value)键值对。 在标准模板...

    C语言实现部分数据结构和算法,包括链表,栈,队列,哈希表,树,排序算法,图算法等等.zip

    数据结构是计算机存储、组织数据的方式,它涉及到数据的逻辑结构、物理结构以及对数据的基本操作。...通过对数据结构的理解和运用,以及对算法的学习和研究,可以帮助我们更有效地解决实际问题,提升编程能力。

    手动实现golang中的map源码

    在这份资源中,你将学习到如何使用Go语言来手动实现一个基本的哈希表数据结构,并将其转化为Go语言中的Map类型。 首先,我们将介绍哈希表的基本概念和原理,包括哈希函数、冲突解决等知识点。接着,我们将逐步实现...

    大一下数据结构实验-图书馆管理系统(基于哈希表).zip

    管理系统是一种通过计算机技术实现的用于组织、监控和控制各种活动的软件系统。这些系统通常被设计用来提高效率、减少错误、加强安全性,同时提供数据和信息支持。以下是一些常见类型的管理系统: 学校管理系统: ...

    集合底层源码分析.doc

     哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“链表的数组”  一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到...

    CS136:数据结构介绍

    CS136 涵盖抽象数据类型,包括对面向对象编程概念的更深刻理解。 学生将学习如何使用分析工具来分析算法的运行时间。 实现线性数据结构,包括堆栈,队列和哈希表。 树的介绍和基本实现

    阿里算法实现

    全书共分17章,包括算法原理、数据结构基本知识、递归、高精度、贪心、动态规划、搜索、线段树、字符串、最小生成树、矩阵连乘、二分和枚举、母函数、树状数组、高斯消元、AC自动机和哈希表,覆盖了计算机算法所需的...

    Sarah Adel Bargal_Universal Hashing notes.pdf

    比较新的英文资料,共4页,非常简洁地介绍了universal hashing,非常容易理解。 universal hashing(在随机算法或数据结构中)是指从... 通用哈希在计算机科学中有许多用途,例如在哈希表,随机算法和密码学的实现中。

    python 密码学示例——理解哈希(Hash)算法

    Hash 是密码学安全性的基石,它引入了单向...很多时候一段加密的消息无法被他人读取和理解(保密性),并不意味着该密文不会在传播过程中被截取和恶意修改(完整性)。 信息摘要(message digest)或指纹(fingerpri

    algorithms-in-python:用 Python 实现的算法和数据结构

    运行测试: python3 mergesort.py哈希表简单的哈希表实现自动调整列表用于实现堆的辅助类。 运行测试: python3 autoresizelist.py堆一个堆的实现。 运行测试: python3 heap.py皇后乐队n-皇后问题的回溯解决方案...

    c语言c++项目源代码_c语言坦克游戏源代码.rar

    此外,代码中还包含了一些常用的数据结构和算法,如链表、二叉树和哈希表等,可以帮助学习者更好地理解和掌握 C 语言的编程技巧。 通过对该源代码的二次开发和定制,你可以实现更多有趣的功能,如添加不同类型的...

    数据结构实验

    DeleteHash( ):删除哈希表中某一关键字 PrintHash ( ):打印输出哈希表 四、思考与提高 如何利用二分查找算法在一个有序表中插入一个元素x,并保持表的有序性? 实验7:至少三种排序算法的程序实现 (第十六周...

    游戏开发入门教程知识点总结以及技巧点总结.docx

    2.理解数据结构与算法,如数组、链表、栈、队列、哈希表、排序和查找算法等。 3. 游戏引擎 4. 1.学习Unity、Unreal Engine等流行游戏引擎的使用,包括场景搭建、光照、物理系统、粒子系统等。 2.掌握脚本系统,如...

    简单的华容道算法c++实现

    参考网上资料写的很烂的算法,运算时间很长,用了一个链表树的结构,穷举棋盘状态并进行结果判断和重复性判断,未用到哈希表结构所以时间很长。

    unordered_map和unordered_set的模拟实现

    unordered_map和unordered_set的模拟实现 (一)哈希表的特性及概念 定义: 哈希表(Hash table,也叫散列表),是根据关键字值(key,value)直接进行访问的数据结构。也就是说,它通过把关键字映射到表中一个位置来...

    【零基础学算法】 超详细动画讲解支持 Java, C++, Python, Go, JS, TS, C#, Swift等语言)

    数组、链表、栈、队列、哈希表、树、堆、图等数据结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤...

Global site tag (gtag.js) - Google Analytics