散列表(也叫哈希表),
google搜索到的头条:散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
我觉得这个解释太含糊,想要整明白哈希表,那就得明白哈希表到底有什么样的优势。
数据结构中,有个时间算法复杂度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))。 这就是说哈希函数的编写是哈希表的一个关键问题,会涉及到一个存储值在哈希表中的统计分布。如果哈希函数已经定义好了,冲突的解决就成为了改变系统性能的 关键因素。其实还有很多种方法来解决冲突情况下的存储和查找问题,不一定非要线性向后排队,如果有好的哈希表冲突的解决方法也能很大程度上提高系统的效 率。
好了,写到这里,哈希表的概念应该搞清楚了吧。今天咱这也是现学现卖,其实我还没有使用过这个数据结构。有不对的地方还请高手指出来,耽误了我自己不怕,免得误导了别人
散列表(也叫哈希表),相关推荐
- 散列查找 散列表(哈希表)
哈希表的平均查找长度是()的函数. A.哈希表的长度 B.哈希表的装填因子 C.哈希函数 D.表中元素的多少 装填因子 = 关键字个数 / 表长 符号表:是 "名字(Name)–属性(Att ...
- 如何设计散列表(哈希表)
如何设计散列表(哈希表) 可以获取到什么 通过本章可以了解散列表是什么数据结构,为什么叫做散列表?他的特点是什么?以及如何去设计一个散列表?为什么要这么设计? 会介绍散列表中三个重要的核心点:散列函数 ...
- [数据结构] 散列表(哈希表)
散列表(哈希表) 比较难理解的官方定义:散列表/哈希表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构.它通过把关键码值映射到表中一个位置来访问记录,以加快查找的 ...
- 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))
本文根据<大话数据结构>一书,实现了Java版的一个简单的散列表(哈希表). 基本概念 对关键字key,将其值存放在f(key)的存储位置上.由此,在查找时不需比较,只需计算出f(key) ...
- 什么是散列表(哈希表)?
散列表(哈希表) 概念 散列表的构造方法 处理冲突的方法 后续 概念 散列函数:一个把查找表中的关键字映射成该关键字对应的地址的函数,记为Hash(key)=Addr(这里的地址可以是数组下标.索引或 ...
- (1)散列表(哈希表)的定义
一般的查找 给你一个顺序表,你会如何查找某个给定的元素? 一般思路就是从表头开始,一个挨一个的比较记录a[i]与key的值是"="还是"≠",直到有相等才算是査 ...
- 散列表(哈希表)知识详解
哈希表 1. 散列表查找(哈希表)概述 2.散列函数的构造方法 3.处理散列(哈希)冲突的方法 3.1开放定址法 3.2 再散列函数法 3.3 链地址法 3.4 公共溢出区法 4. 散列表查找的实现 ...
- 《算法导论》学习分享——11. 散列表(哈希表)
11. 散列表(哈希表) 文章目录 11. 散列表(哈希表) 直接寻址表 散列表 链接法散列分析 散列函数 除法散列 乘法散列 全域散列 开放寻址法 线性探查 双重探查 开放寻址法分析 完全散列 涉及 ...
- 程序员的进阶课-架构师之路(16)-散列表(哈希表)
前言 当我们在编程过程中,往往需要对线性表进行查找操作.在顺序表中查找时,需要从表头开始,依次遍历比较a[i]与key的值是否相等,直到相等才返回索引i:在有序表中查找时,我们经常使用的是二分查找,通 ...
- 数据结构(55) 散列表(哈希表,hash table,hash map)
目录 1.散列表的基本概念 2.散列函数的构造方法 3.常用的散列函数 3.1.直接定址法 3.2.除留余数法 3.3.数字分析法 3.4.平方取中法 3.5.乘法哈希法(The Multiplica ...
最新文章
- 计算机科学技术作文600,生活因科技而精彩作文600字
- matepad什么时候升级鸿蒙,华为MatePad Pro迎来EMUI 11正式版升级 后续可直接升级鸿蒙系统...
- python Demo 01 爬取大学名称
- 前端学习(2600):响应控制
- Android app 应用签名
- 初学java小白的疑惑梳理
- Martin Fowler 经典软件著作合集
- Jvm(20),如何定义为垃圾对象----引用计数法
- windows下CRF++的安装与使用
- Atitit 个人 企业 政府 等组织 财政收入分类与提升途径attilax总结 1.1. 国家财政收入分类	1 1.2. 企业收入分类	1 1.3. 个人收入分类	1 1.1.国家财政收入分类
- 第二章:WebDriver 打开Firefox浏览器 和 Chrome 浏览器
- 64位plsql连接oracle,PLSQL Developer连接Oracle11g 64位数据库配置详解(转)
- 学习码 滚动码 固定码 有什么区别重码数,编码容量滚动码的原理
- iOS 什么是MVC
- html网页设计的难点,在做设计与制作网页中主要难点是什么?
- 员工成长阶段与激励方式探讨
- 论文笔记:ReDet: A Rotation-equivariant Detector for Aerial Object Detection
- 绝地求生手游电脑版连接服务器没有响应,绝地求生电脑版进去为什么连接失败 | 手游网游页游攻略大全...
- blogbus.com(博客大巴)XSS跨站漏洞
- 基于ODBC的MFC与sql_server2008r2连接教程和错误解决方法
热门文章
- LNMP架构详解(2)——Mysql、PHP、Nginx源码编译过程
- MySQL数据表的优化
- 扇贝python课程打卡_Python爬虫:获取扇贝打卡信息
- python表单防重复提交_防止表单重复提交的几种策略
- 华南师范大学计算机学院拟录取,华南师范大学各学院2015年硕士拟录取名单公示...
- 隐私全无!错发1700多条Alexa录音,上报后亚马逊淡定回应是“个人错误”
- java产生随机数(学习)
- Git011--分支管理策略
- 8种最有可能在2016年倒闭的光伏企业
- 编程成长日记——有意思的编程题(二)