Hash,到底好用还是不好用?

  Hash是一种离数散算法,译名为哈希,它的基础概念就是映射,把数据按一定方式分类,存到一个数组里。如数组a[]{1,4,5,2,6,8,11},把这个a[i]存到Hash[a[i]^3%10],就是一种哈希,它的Hash存储方式就是a[i]^3%10。

  有人挺Hash,但有人不建议用Hash,这还得看具体问题和Hash的优缺点。

  Hash相较于数组而言,Hash的存储数有规律的,通过数据就能直接得到它存储的位置,查询这一操作是o(1)的,非常方便快捷。但是它的缺点是空间占用高,一般来说要开数组的2倍甚至更多。

  综上所述,如果用到多次通过数据找存储地址且空间足够的话,用Hash是很好的选择,但是Hash在写的过程中难免会遇到问题。

  我们都知道,a数组的每个数都对应着Hash数组里独一无二的地址,但是比如上面的例子,a[0]为1,在Hash数组里应存为Hash[1^3%10]也就是Hash[1],但a[6]的11,11^3%10同样为1,所以这无法保证每一个元素都有独一无二的地址,这叫做哈希冲突。

  哈希冲突的解决办法有两种,一种是往后寻找,直到找到空位就插入;另一种是用vector,在Hash[i]后挂一个“链表”,但其实就是一个vector,后面接着一连串的同哈希地址的数字。关于这两种用哪一种,第一种更适合于重复概率较小或数据本身较小,如果遇上数据又大,重复率又高,那么就用第二种。

 

The End

posted @ 2022-07-11 22:50  唯私の超电磁砲  阅读(219)  评论(0编辑  收藏  举报