翻了一下数据结构的书,复习了散列的相关知识点,总结如下:
散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h(K)计算出对应的函数值,把这个值解释为结点的存储地址,将结点存入到此存储单元中。在一般的情况下,散列表的空间必须比结点的集合大,此时虽然浪费了一定的空间,但是换取的是检索效率。散列的好坏依赖于散列函数的设计。散列函数可能对于不相等的关键码计算出相同的散列地址即发生冲突,发生冲突的两个关键码称为该散列函数的同义词。
采用散列技术时候需要考虑的两个首要问题是:
1)如何构造使结点“分布均匀”的散列函数?
2)一旦发生冲突,用什么方法来解决?
散列函数
1. 除余法
h(x)=x mod M
通常M的值为某个质数或者2的幂
2. 乘余取整法
hash(key)=floor(n*(A*key%1));
A*key%1=A*key-floor(A*key)
通常假设地址空间为p位,则n=power(2,p)。研究表明一般取A=(sqrt(5)-1)/2
3. 平方取中法
4. 数字分析法
5. 基数转换法
将关键码值看成另一种进制的数再转换成原来进制的数,然后选其中几位作为散列地址。如key=210485,则