您的位置:首页 > 职场人生

java面试题之 哈希是什么?为什么哈希存取比较快?

2014-05-12 21:28 295 查看
引用/article/8561522.html

问题:

今天去面试,面试官问“哈希是什么?为什么哈希存取比较快?”

被问住了啊啊

请大神解惑

本内容为本人学习《大话数据结构》一文的总结摘要:

哈希算法存取之所以快,是因为其 直接通过关键字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);

这里简单列举常见的查找方法:

顺序表查找:

有序查找:

折半查找

插值查找

斐波那契查找

线性索引查找:

稠密索引

分块索引

倒排索引

二叉排序树动态查找:

平衡二叉树(AVL树)

多路查找树(B树)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: