Day.13 Hash map

任何语言都会提供这一种资料结构,像Golang的map
ex. var hash map[string]int

array是以int作为index key,但hash map可以用string或其他的型态去当index使用,时间速度也很快,新增删除修改的时间复杂度都为O(1),所以写程序的时候很常会用到。
简单说一下它的原理!

以电脑的储存方式要嘛就是连续跟非连续(array or pointer),map是array的一种延伸用法,大家看一下这张图。
https://ithelp.ithome.com.tw/upload/images/20210921/20129767rBhvPZz0cm.png

一个hash map底下会有一个array,简称bucket(桶子),它是用来放val的,array的key都是int,那我们的key要用string那怎麽办?
这时候会设计一个hash function把string hash成int的index,找到对应的bucket,只要确保算法在同样的input有同样的output,就可以用key val的方便存取值了。

如图,现在有4个bucket,hash function就是把string的第一个值转成ASCII code再去mod(%)4,像dog的d ASCII code是100,100%4数值刚好是0,而且每次hash出来的结果都不会变,这样我们就可以把dog存在bucket 1。

现在要存apple的key,97%4 index是1,放在bucket 2。但!如果这时候要存dig这个key怎麽办?因为dig跟dog开头一样,最後hash的值一样是0,但bucket 1之前已经被占用了。这种情况叫Hash map collision,不一样的key hash出一样的结果。解法有好几种,以下为大家介绍的是链结法。

简单来说就是用链结来处理,bucket存放一条链结,当发生collision的时候,就把值串在链结就行了!
图:
https://ithelp.ithome.com.tw/upload/images/20210921/20129767Sg7kI5FphP.png

你可能会想到,如果key很多都是d开头的,链结不就一直串下去吗?
对没错~读取的速度就会从O(1)变为O(n),因为找到bucket了,还在从链结的头一直往下找,所以bucket的数量跟hash function够不够平均是很重要的!当bucket够多,hash够平均,速度就会一直保持在O(1),我上面提到的例子只是简化给大家理解,真实上的string hash function更为复杂,而且bucket的数量还会动态去扩充!

明天会把今天讲的写成code!


<<:  从零开始学3D游戏设计:零件介面 Part.2 完成介面

>>:  [早餐吃到饱-2] 星享道酒店 - 星飨道国际自助餐 - 早餐 In Sky International Buffet - 台中逢甲商圈

DAY 21 - 四足战车 (2)

大家好~ 我是五岁~ 今天来画四足战车的草图细节~ 首先来画上半部 依照昨天的外型草稿,进一步认真的...

Day05-Variables

前言 在我们之前的练习都只有使用var宣告变数,其实还有其它两个宣告方式可以使用。 接下来我们会学习...

【Day2】Information Security Overview

随着新的科技环境变化, 资讯安全也会变得更多面向。 根据NIST(美国国家标准暨技术研究院)定义的电...

作用域 Scope、作用域链 Scope Chain

在初学阶段,还蛮常碰到明明定义好的变数却回报 error,可能是因为对 Scope 的观念没有理解。...

如何把D槽空间分给C槽

询问各位大大,我在网路上看到要转移空间,就是按下延伸磁碟机。 但是我的的C槽却一直无法出现,延伸磁...