`
gxjlt
  • 浏览: 7039 次
  • 性别: Icon_minigender_1
  • 来自: 地球
最近访客 更多访客>>
社区版块
存档分类
最新评论

hash表浅析

阅读更多
   散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
    我觉得这个解释太含糊,想要整明白哈希表,那就得明白哈希表到底有什么样的优势。
数据结构中,有个时间算法复杂度O(n)的概念来衡量某种算法在时间效率上的优劣。哈希表的理想算法复杂度为O(1),也就是说利用哈希表查找某个值,系统所使用的时间在理想情况下为定值,这就是它的优势。那么哈希表是如何做到这一点的呢?
我们定义一个很大的有序数组,想要得到位于该数组第n个位置的值,它的算法复杂度为O(1)。哈希表利用哈希函数将需要存储的内容的关键值转换为这个有序数组中的某个值,在被存储内容和有序数组之间建立了映射关系。这样,下次我们对这个值进行查找时只要使用同一个哈希函数对关键值进行转换,找到这个数组值就可以了。
如果还没有明白是怎么回事的话,那我们来举个例子。假设我们要做个存储结构,需要存储下来三国中的人物,以及他们的详细信息。我们用他们的名字来作为存储的关键值,例如:刘备,曹操,孙权,关羽,张飞......等等。这个时候我们如果想用一般的方法来查找这些英雄豪杰,需要遍历整个存储空间,如果这些英雄豪杰一共有n个,那么这时候的时间算法复杂度为O(n)。显然如果n值很大,每次想要找到某个英雄的详细信息就需要比较长的时间。
此时我们先定义一个大的有序结构数组HashValue[m],用来存放各位英雄豪杰的信息。然后编写一个哈希函数ChangeToHashValue(name),函数的具体内容就不细说了,反正这个函数会将这些做为关键值的名字转换为HashValue[m]中的某个下标值x。然后可以将英雄的信息放进HashValue[x]中去。这样,可以将所有英雄的信息存储起来。当查询的时候再使用哈希函数ChangeToHashValue(name)得到这个下标值,这样就很容易得到了这个英雄的信息。例如:ChangeToHashValue(刘备)为10,那么就将刘备存储到HashValue[10]里面。当查询的时候再次使用ChangeToHashValue(刘备)得到10,这个时候我们就可以很容易找到刘备的所有信息。在实际应用中如果我们想把所有的英雄豪杰都存储进系统时,需要定义m>n。就是数组的大小要大于需要存储的信息量,所以说哈希表是一个以空间换取时间的数据结构。
这个时候问题来了,出现了这种情况ChangeToHashValue(关羽)和ChangeToHashValue(张飞)得到的值是一样的,都是250,我们岂不是在存储过程中会遇到麻烦,怎么安排他们二位的地方呢?(总不能让二位打一架,谁赢了谁呆在那吧),这就需要一个解决冲突的方法。当遇到这种情况时我们可以这样处理,先存储好了关羽,当张飞进入系统时会发现关羽已经是250了,那咱就加一位,251得了,这不就解决了。我们查找张飞的时候也是,一看250不是张飞,那就加个1,就找到了。这时还存在一个问题。直接用ChangeToHashValue(赵云)为251,张飞已经早早占了他的地方,那就再加1存到252呗。呵呵,这时我们会发现,当哈希函数冲突发生的机率很高时,可能会有一群英雄豪杰在250这个值后面扎堆排队。要命的是查找的时候,时间算法复杂度早已不是O(1)了(所以我们说理想情况下哈希表的时间算法复杂度为O(1))。 这就是说哈希函数的编写是哈希表的一个关键问题,会涉及到一个存储值在哈希表中的统计分布。如果哈希函数已经定义好了,冲突的解决就成为了改变系统性能的关键因素。其实还有很多种方法来解决冲突情况下的存储和查找问题,不一定非要线性向后排队,如果有好的哈希表冲突的解决方法也能很大程度上提高系统的效率。

分享到:
评论

相关推荐

    MySQL JOIN 工作原理浅析1

    Hash Join 算法会将驱动表 R 中的记录导入内存并创建一张哈希表,然后遍历被驱动表 S 的每一条记录,逐一在哈希表中判断当前记录是否满足连接条件。 Hash Join 的优点在于可以大幅度提高连接速度,特别是在被驱动...

    Redis架构下的MySQL数据库性能提升浅析.pdf

    MySQL 中的数据都是按照表存储的,更微观地看,这些表都是按照行存储的。每执行一次 select 查询,MySQL 都会返回一个结果集,该结果集由若干行组成。因此需要在 Redis 中找到一种对应于 MySQL 行的数据结构。Redis ...

    Linux内核bridge浅析.doc

    地址学习过程通常基于ARP协议,当网桥接收到一个带有未知MAC地址的目标的帧时,会发送ARP请求来获取对应的IP地址,然后更新hash表。一旦目标MAC地址被学习到,后续相同目标的帧就可以直接转发,无需再进行广播,从而...

    Oracle数据库性能优化浅析

    ### Oracle数据库性能优化浅析 #### 一、引言 SQL作为数据库查询语言,其编写质量直接影响着数据库系统的整体性能。对于Oracle数据库而言,优化SQL查询不仅能够提高查询效率,还能减少系统资源消耗,进而提升整个...

    Mysql数据表分区技术PARTITION浅析

    MySQL 数据表分区技术是一种优化大型数据库性能的有效方法,它通过将大表逻辑上分为多个部分,使得查询操作能更高效地处理数据。分区技术在 MySQL 5.1 及以后的版本中得到了支持,提供了四种主要的分区类型:RANGE、...

    MySQL核心Innodb存储引擎浅析—事务系统

    ### MySQL核心Innodb存储引擎浅析—事务系统 #### 存储引擎介绍 在MySQL中,存储引擎是处理表的存储方式的核心组件之一。不同的存储引擎提供了不同的特性,如事务支持、锁定粒度等。其中,MyISAM和InnoDB是最常用...

    Innodb存储引擎浅析—事务系统

    ### Innodb存储引擎浅析—事务系统 #### 学述 在MySQL的众多存储引擎中,InnoDB无疑是最为重要且被广泛使用的之一。本文旨在深入解析InnoDB存储引擎中的事务处理机制及其背后的设计原理。 #### 存储引擎介绍 在...

    域权限维持方法浅析.pdf

    DSRM -Pass The Hash&DCSync Malicious Security Support Provider (SSP) Hook PasswordChangeNotify Skeleton Key DCShadow BadGPO(Group Policy Objects) ACL (Access Control Lists) ACL -AdminSDHolder ACL -...

    浅析PHP中加密函数的应用.pdf

    MD5 函数是一种常用的加密算法,MD5 的全称是 Message.Digest Algorithm 5,Message.Digest 通常指的是字节串的 Hash 变换,即为把一个任意长度的字节串转换为一定长度的整数。MD5 将任意长度的字节串变换成一个 ...

    分布式业务网浅析.pdf

    - P2P重叠网络层主要实现资源的查找和定位,一般基于结构化P2P技术,并采用分布式DHT(Distributed Hash Table)作为路由实现方式。 - SIP应用层则完成基于SIP协议的各种应用,比如语音、多媒体、即时消息和呈现等。...

    纯分布式P2P网络结构浅析.pdf

    而结构化P2P网络使用分布式哈希表(Distributed Hash Table,DHT)方法来组织网络,使得每个节点负责存储一部分全局信息,可以通过高效的算法快速定位资源,提高了搜索的效率。 3. P2P网络的关键技术 文中提到了...

    浅析Postgre SQL的索引管理技术.pdf

    PostgreSQL支持多种类型的索引,包括B树(B-Tree)、哈希(Hash)、GiST(Generalized Search Tree)、SP-GiST(Spatial Indexes)、GIN(Generalized Inverted Indexes)和BRIN(Bitmap Range Indexes)。...

    浅析Ruby的源代码布局及其编程风格

    在使用块(block)和哈希(hash)时,对于大括号的空格处理有不同风格。第一种风格是在大括号前后加上空格,第二种风格是不加空格。两种风格都有其优点,但应保持一致性。例如: ```ruby # 空格风格 { one: 1, two:...

    11-vue-router-模式.md

    abstract模式浅析 - **abstract模式适用环境**: 由于abstract模式不依赖浏览器的history API,因此它不关心URL的变化,路由地址仅在内存中维护。 - **抽象模式的限制**: - 由于是抽象的,它更适合在非浏览器...

    浅析nginx刚刚发布的JavaScript能力nginScript

    背景 2015年9月,nginx宣布支持类JavaScript语言。...Nginx也更开发的走向了动态配置化的下一个阶段。... 先简单说说nginx Nginx [engine x]是全球最受欢迎,也是最优秀的web服务器、反向代理服务器。...

Global site tag (gtag.js) - Google Analytics