【668】哈希算法
前面我们介绍过 【544】Geohash 相关说明,其实是有一定相关性的。同时跟 【553】rtree,R树 相关 也是有一些关系的。整体思想就是通过一定的规则也就是一个函数,将 key 映射到一个新的小的区域,然后在小的区域查找,就可以明显增加了效率。Geohash 就是将经纬度的坐标点都映射到不同的矩形框中;R树 也是将矢量图形映射到对应的矩形框中,然后分析矩形框之间,之后再细分。
言归正传,首先列下相关参考信息:
简单举个例子:
假设有一栋楼,住着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之间的某个表索引,然后在该索引所对应的空间进行变量的存储/读取等操。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
2018-11-18 【340】GIS related knowledge
2015-11-18 【179】IDL 读写 NetCDF 文件
2011-11-18 【C017】VBA为多文件夹内文件加表头