哈希
基本知识
哈希是什么
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。——度娘
哈希能干什么
哈希可以减少在去重时所耗的空间(代价就是时间)
各种哈希
一维哈希
哈希就是把你要存储(去重)的数模上一个数后,在存储进去数组。
这样就会有很多空的位置会省去。
但由此而来的,就会有冲突(两个不一样的数模上一个数后,变成了同一个数),这时候,我们就应该将哈希的位置往后移。
举个例子,假设我们要存进去两个数,一个是12,一个是19,而恰好,我们选的模数是7,这时候两个数模出来的得数都是5。
这时候,12先入。
当我们在把19放进去的时候,发现5这个位置已经有数了,这是,我们就应该把他放在旁边的位置,以便于后面查找,就像这样。
然后冲突就消失了!
接下来,讲讲查找。
首先,我们按照存储一个数的方法,把他的下标求出来,我们还是拿12和19,模数是7的情况。这时,我们要查找的数是19。
这时候,我们先来到5这个位置。但是,发现这里有数了,但却不是自己本身。
按照我们刚才的做法,这是他就应该往下一位去找了。这时,他会发现,他找到了他自己,这说明他之前存储过。
这样子,我们的查找(去重)过程就完毕了。
但如果他没在这里面出现过呢?就像26。
这时,他一个个比较,发现都不是他自己,直到找到一个空位,就再把自己塞进去。
这样子,一维哈希就讲完了。
二维哈希(未完成)
既然已经懂了一维哈希,这里二维哈希就应该比较好 理解。
(有点头晕,等下次有时间再把它补上)