`

Hash哈希表

F# 
阅读更多
比较方法:
一、直接原数据的比较
二、数据通过某种映射后比较

能不能不通过比较,一次就能得到数据的地址?
正如数组,通过下标,一次就能得到数据。

Hash正是将原始数据A,通过某种方法F,产生一个下标i:
i = F(A);

if ( S(i) == A)

------------------------------------

1、直接定址法。
针对某些带有顺序性的数据,如一堆年份。
0  1988
1  1989
2  ……
是不是很像数组呢。但很少数据这么有规律的。

2、数字分析法。
也是针对很有规律的数据。


3、除留余数法。
h(key) = key % p
这里P的取值起着决定因素,一般取等于或小于表长m,m的最大素字。
这样除起来,分布才会均匀,大家都能得到一个“下标”;

4、平方取中法
将数据取平方后,再取特定位数作地址。
原理是放大数据的特征、差别。

5、折叠法
将数据分块分段,相加起来,使它“缩小”成一个key。
这里分块或分段的大小也很重要,决定了冲突的大小。

------------------------------------

上面那些方法,总体来说,都是想将数据通过某种方法,抽象为一个下标。
而不同的方法,识别能力不同,那么将会造成冲突。
解决数据冲突,有所谓的开发地址法,和链地址法。
我觉得开放地址法,很不好,很自私。
可能将属于别人的位子给占了,别人又去抢占别人的位子。
而链地址法,相当于一种分享、共享地址key。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics