海量数据处理:Hash法
Hash一般被称为散列,是一种映射关系,即给定一个数据元素,其关键字为key,按一个确定的散列函数计算出hash(key),把hash(key)作为关键字key对应元素的存储地址(或称散列地址),再进行数据元素的插入和检索操作。简而言之,散列函数就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
散列表是具有固定大小的数组,表长(即数组的大小)应该为质数。散列函数是用于关键字与存储地址之间的一种映射关系,但是不能保证每个元素的关键字与函数值是一一对应的,因为极有可能出现对应于不同的元素,却计算出了相同的函数值,冲突指的是两个关键字映射到同一个存储地址的情况,即对不同的关键字可能得到同一散列地址,即key1=key2,而f(key1)=f(key2)。
散列函数一般应具备以下几个特点:
- 运算应该尽可能简单
- 函数的值域必须在散列表的范围内
- 尽可能的减少冲突
针对散列函数的这些特点,在构建散列表时,不仅要设定一个好的散列函数,而且还要设定一种处理冲突的方法。常用的散列函数的构建方法一般有以下几种:
(1)直接寻址法
取关键字或关键字的某个线性函数值为散列地址,即h(key)=key或h(key)=a.key+b,其中a和b均为整型常数,这种散列函数叫做自身函数。这种方法效率比较低,时间复杂度为O(1),空间复杂度为O(n),n为关键字的个数。
直接寻址法不会产生冲突,但由