今天无意中有人问到一个问题,“为什么哈希查询比较快?”
我没多想就回答道,”是因为采用键值对的方式,快速索引到值得内存地址“。
接着又问,”键值对的方式的原理是什么?“
当时一愣,没不知如何回答,只好说”抱歉“。
手边没有书,也懒得去做名词解释了,在网上搜索到的一句话:
当插入键值对到Hashtable中时,Hashtable使用每个键所引用对象的GetHashCode()方法,获取一个哈希编码,存入Hashtable中。
总之,
(1)哈希函数的规则是:通过某种转换关系,使关键字适度的分散到指定大小的的顺序结构中。越分散,则以后查找的时间复杂度越小,空间复杂度越高。
(2)使用hash,我们付出了什么?
hash是一种典型以空间换时间的算法,比如原来一个长度为100的数组,对其查找,只需要遍历且匹配相应记录即可,从空间复杂度上来看,假如数组存储的是byte类型数据,那么该数组占用100byte空间。现在我们采用hash算法,我们前面说的hash必须有一个规则,约束键与存储位置的关系,那么就需要一个固定长度的hash表,此时,仍然是100byte的数组,假设我们需要的100byte用来记录键与位置的关系,那么总的空间为200byte,而且用于记录规则的表大小会根据规则,大小可能是不定的,比如在lzw算法中,如果一个很长的用于记录像素的byte数组,用来记录位置与键关系的表空间,算法推荐为一个12bit能表述的整数大小,那么足够长的像素数组,如何分散到这样定长的表中呢,lzw算法采用的是可变长编码。
注:hash表最突出的问题在于冲突,就是两个键值经过哈希函数计算出来的索引位置很可能相同。