比较方法:
一、直接原数据的比较
二、数据通过某种映射后比较
能不能不通过比较,一次就能得到数据的地址?
正如数组,通过下标,一次就能得到数据。
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。
一、直接原数据的比较
二、数据通过某种映射后比较
能不能不通过比较,一次就能得到数据的地址?
正如数组,通过下标,一次就能得到数据。
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。