发布时间:2025-11-02 19:09:19 点击量:
HASH GAME - Online Skill Game GET 300
Hash 表理解 言归正传,哈希表又名散列表,其主要目的是用于解决数据的快速定位问题。考虑如下一个场景。 一列键值对数据,存储在一个 table 中,如何通过数据的关键字快速查找相应值呢?不要告诉我一个个拿出来比较 key 啊,呵呵。 (key-value 这样的数据,要恰当的选择 key,一般情况下 key 和 value 是等同的) 大家都知道,在所有的线性数据结构中,数组的定位速度最快,因为它可通过数组下标直接定位到相应的数组空间,就不需要一个个查找。而哈希表就是利用数组这个能够快速定位数据的结构解决以上的问题的。 具体如何做呢?大家是否有注意到前面说的话:“数...
Hash 表理解 言归正传,哈希表又名散列表,其主要目的是用于解决数据的快速定位问题。考虑如下一个场景。 一列键值对数据,存储在一个 table 中,如何通过数据的关键字快速查找相应值呢?不要告诉我一个个拿出来比较 key 啊,呵呵。 (key-value 这样的数据,要恰当的选择 key,一般情况下 key 和 value 是等同的) 大家都知道,在所有的线性数据结构中,数组的定位速度最快,因为它可通过数组下标直接定位到相应的数组空间,就不需要一个个查找。而哈希表就是利用数组这个能够快速定位数据的结构解决以上的问题的。 具体如何做呢?大家是否有注意到前面说的话:“数组可以通过下标直接定位到相应的空间”,对就是这句,哈希表的做法其实很简单,就是把 Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将 value 存储在以该数字为下标的数组空间里,而当使用哈希表进行查询的时候,就是再次使用哈希函数将 key 转换为对应的数组下标,并定位到该空间获取 value,如此一来,就可以充分利用到数组的定位性能进行数据定位。 (key 转换后成为数组的下标,value 作为数组的值) 不知道说到这里,一些不了解的朋友是否大概了解了哈希表的原理,其实就是通过空间换取时间的做法。到这里,可能有的朋友就会问,哈希函数对key 进行转换,取余的值一定是唯一的吗?这个当然不能保证,主要是由于hashcode 会对数组长度进行取余,因此其结果由于数组长度的限制必然会出现重复,所以就会有“冲突”这一问题,至于解决冲突的办法其实有很多种,比如重复散列的方式,大概就是定位的空间已经存在 value 且 key 不同的话就重新进行哈希加一并求模数组元素个数,既 (h(k)+i) mod S , i=1,2,3,直到找到空间为止。还有其他的方式大家如果有兴趣的话可以自己找找资料看看。 前面讲的查找方法是基于比较的方法,查找效率依赖比较次数,其实理想的查找是希望不经比较,一次存取便能得到所查记录。这样就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系 f,查找 k 时,只要根据这个对应关系 f 找到给定值 k 的像 f(k)。这种对应关系 f 叫哈希(hash)函数。按这种思想建立的表叫哈希表(也叫散列表)。