哈希为什么查询速度 快
来源:互联网 发布:上海大数据开放平台 编辑:程序博客网 时间:2024/06/01 20:04
哈希算法存取之所以快,是因为其 直接通过关键字key得到要存取的记录内存存储位置
试想这样的场景,你很想学太极拳,听说学校有个叫张三丰的人打得特别好,于是你到学校学生处找人,学生处的工作人员可能会拿出学生名单,一个一个的查找,最终告诉你,学校没这个人,并说张三丰几百年前就已经在武当山作古了。可如果你找对了人,比如在操场上找那些爱运动的同学,人家会告诉你,"哦,你找张三丰呀,有有有,我带你去。于是他把你带到了体育馆内,并告诉你,那个教大家打太极的小伙子就是张三丰',原来"张三丰.是因为他太极拳打得好而得到的外号。学生处的老师找张三丰,那就是顺序表查找,依赖的是姓名关键字的比较。而通过爱好运动的同学询问时,没有遍历,没有比较,就凭他们"欲找太极'张三丰',必在体育馆当中"的经验,直接告诉你位置。
也就是说,我们只需要通过某个函数f,使得:存储位置=f (关键字)
那样我们可以通过查找关键字不需要比较就可获得需要的记录的存储位置。这就是一种新的存储技术一一散列技术(哈希算法)。
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key 对应一个存储位置f (key)。查找时,根据这个确定的对应关系找到给定值key 的映射f (key) ,若查找集合中存在这个记录,则必定在f (key) 的位置上。这里我们把这种对应关系f 称为散列函数, 又称为哈希(Hash) 函数。按这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。 那么关键字对应的记录存储位置我们称为散列地址。
整个散列过程其实就是两步。
(1) 在存储时,通过散列函数计算记录的散列地址,并按此散列地址存储该记录。
(2) 当查找记录时,我们通过同样的散列函数计算记录的散列地址,按此散列地址访问该记录。由于存取用的是同一个散列函数, 因此结果当然也是相同的。
所以说,散列技术既是一种存储方法,也是一种查找方法。然而它与线性表、树、图等结构不同的是,前面几种结构,数据元素之间都存在某种逻辑关系,可以用连线图示表示出来,而散列技术的记录之间不存在什么逻辑关系,它只与关键字有关联。因此,散列主要是面向查找的存储结构。
我们时常会碰到两个关键字key1 != key2,但是却有f(key1) = f(key2),这种现象我们称为哈希冲突,如果没有哈希冲突,散列表是一种非常高效的查找数据结构,其时间复杂度为O(1);
试想这样的场景,你很想学太极拳,听说学校有个叫张三丰的人打得特别好,于是你到学校学生处找人,学生处的工作人员可能会拿出学生名单,一个一个的查找,最终告诉你,学校没这个人,并说张三丰几百年前就已经在武当山作古了。可如果你找对了人,比如在操场上找那些爱运动的同学,人家会告诉你,"哦,你找张三丰呀,有有有,我带你去。于是他把你带到了体育馆内,并告诉你,那个教大家打太极的小伙子就是张三丰',原来"张三丰.是因为他太极拳打得好而得到的外号。学生处的老师找张三丰,那就是顺序表查找,依赖的是姓名关键字的比较。而通过爱好运动的同学询问时,没有遍历,没有比较,就凭他们"欲找太极'张三丰',必在体育馆当中"的经验,直接告诉你位置。
也就是说,我们只需要通过某个函数f,使得:存储位置=f (关键字)
那样我们可以通过查找关键字不需要比较就可获得需要的记录的存储位置。这就是一种新的存储技术一一散列技术(哈希算法)。
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key 对应一个存储位置f (key)。查找时,根据这个确定的对应关系找到给定值key 的映射f (key) ,若查找集合中存在这个记录,则必定在f (key) 的位置上。这里我们把这种对应关系f 称为散列函数, 又称为哈希(Hash) 函数。按这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。 那么关键字对应的记录存储位置我们称为散列地址。
整个散列过程其实就是两步。
(1) 在存储时,通过散列函数计算记录的散列地址,并按此散列地址存储该记录。
(2) 当查找记录时,我们通过同样的散列函数计算记录的散列地址,按此散列地址访问该记录。由于存取用的是同一个散列函数, 因此结果当然也是相同的。
所以说,散列技术既是一种存储方法,也是一种查找方法。然而它与线性表、树、图等结构不同的是,前面几种结构,数据元素之间都存在某种逻辑关系,可以用连线图示表示出来,而散列技术的记录之间不存在什么逻辑关系,它只与关键字有关联。因此,散列主要是面向查找的存储结构。
我们时常会碰到两个关键字key1 != key2,但是却有f(key1) = f(key2),这种现象我们称为哈希冲突,如果没有哈希冲突,散列表是一种非常高效的查找数据结构,其时间复杂度为O(1);
阅读全文
0 0
- 哈希为什么查询速度 快
- 哈希算法为什么存取速度快?
- 为什么MyISAM会比Innodb的查询速度快。
- mysql使用索引为什么查询速度变快很多?
- 为什么MyISAM会比Innodb的查询速度快。
- mysql使用索引为什么查询速度变快很多?
- Hbase 查询为什么快
- 为什么使用了哈希算法的字典查集合找速度比全局遍历字典查集合速度快?
- Spark连接到MySQL并执行查询为什么速度会快?
- Lua 的速度为什么比 Python 快
- ssd为什么比hdd速度要快
- Lua 的速度为什么比 Python 快?
- hbase 为什么查询比较快
- Hbase查询速度快的缘由
- 为什么MyISAM会比Innodb的查询速度快。 btree 和 lsm(hbase) ,cola 树(tokuDB)选型和原理
- ++num和num++哪个执行速度更快,++num为什么会比num++速度快
- DataReader绑定查询出来的一条记录。速度查询快
- 为什么数据库索引查询会快
- sdut 1466 双向队列
- Python2.7+PyQt4 QtDesigner学习笔记系列——2:QtDesigner初视
- (DOM艺术) 第八章 充实文档内容一
- openfile存储服务器及oracle体系架构简介
- 【bzoj3728】PA2014Final Zarowki
- 哈希为什么查询速度 快
- 设计模式 工厂模式
- md5加密
- 跟磊哥学工控-开篇
- GTK实现简单计算器(calculator.c)
- 9.13 笔记-PDO对象操作数据库
- 图像处理中的一阶偏导数和二阶偏导数
- equals与==的区别
- bzoj 4542: [Hnoi2016]大数