【668】哈希算法


  前面我们介绍过 【544】Geohash 相关说明,其实是有一定相关性的。同时跟 【553】rtree,R树 相关 也是有一些关系的。整体思想就是通过一定的规则也就是一个函数,将 key 映射到一个新的小的区域,然后在小的区域查找,就可以明显增加了效率。Geohash 就是将经纬度的坐标点都映射到不同的矩形框中;R树 也是将矢量图形映射到对应的矩形框中,然后分析矩形框之间,之后再细分。

  言归正传,首先列下相关参考信息:

详解Python字典的底层原理——哈希表(Python面试必备)

关于Python中的字典(映射、哈希、散列)理解

使用python实现哈希表、字典、集合

小白入门——哈希算法

  简单举个例子:

  假设有一栋楼,住着1000人,你有个好朋友小王,住在这栋楼,你有急事要找他,你不知道他住几楼几号房间。这时你怎么办?你找到门卫处,向门卫说,我找小王。

  列表的方法:

  门卫说:我们这里每一个房间住着谁都有记录,这是记录本,你自己找吧!这个记录本有1000条记录,你从第一条开始翻,一条一条往下看,终于在第177条记录的时候找到了你的朋友小王所在的房间号。

  字典的方法:

  门卫说: 我这里有一个公式,只要你记得你的朋友的名字,就能很快的找到你朋友在几号房间。

  这个公式是:hash(姓名)%1001

  对你的朋友小王的名字进行hash运算,然后对得到的结果对1001进行取余操作,得到的数字就是你的朋友小王的房间号了,经过计算,你发现hash(‘小王’)%1001=177。

  当然,上面的例子比较极端,总体来说,就是将 key 映射到一个个小的区域,然后在小的区域进行查找。再举个例子,假如说中国人的身份证号是唯一的,而且都生活在身份证地址所在的地方,加入我们想查找某个身份证 S 所对应的人,最简单的方法就是遍历,将全中国的人进行从头到尾的问,你的身份证是 S 吗,如果是,我们就找到了,最差的情况,我们可能需要问 14亿 次,但是如果换成 哈希算法,就是这样操作。首先建立一个 Hash 函数,通过这个函数可以将身份证映射到不同的省份,因此如果想要查找 S,那么直接去 S 所映射的省份即可,这样就大大增加了效率,同理,在省内,可以再构建一个 Hash 函数,映射到不同的市,然后到区,然后到街道,到小区,到最低的行政单位,这样才能高效的查找。这样做的好处就是非常快,坏处就是需要存储很多信息,因此空间复杂度会加大。

  进入正题:

  这就是哈希函数,通过一定的规则,将 key 映射到一个索引上面,然后存储到对应的索引上面,这样如果查找对应的 key 的时候,直接通过哈希函数查找对应的索引即可,存在哈希冲突的情况,即多个key映射到同一个索引上面,通过下面的拉链法来解决:

  基本思路就是将映射到同一个索引的 key 值连接起来,因此查找到索引后,再在内部进行一次顺序查找。

  1.python字典及其特性

  字典是Python的一种可变、无序容器数据结构,它的元素以键值对的形式存在,键值唯一,它的特点搜索速度很快:数据量增加10000倍,搜索时间增加不到2倍;当数据量很大的时候,字典的搜索速度要比列表快成百上千倍1。

  2.哈希表

  Python字典的底层实现是哈希表。什么是哈希表,简单来说就是一张带索引和存储空间的表,对于任意可哈希对象,通过哈希索引的计算公式:hash(hashable)%k(对可哈希对象进行哈希计算,然后对结果进行取余运算),可将该对象映射为0到k-1之间的某个表索引,然后在该索引所对应的空间进行变量的存储/读取等操。

相关