程序员社区

海量数据处理

海量信息,即大规模数据。随着互联网技术的发展,信息越来越多,从中提取有用信息成为当前互联网技术发展必须要面对的问题。

基本方法:

1.Hash法

Hash一般称为散列,他是一种映射关系,给定数据元素,其关键字为key,按一个确定的散列函数计算出hash(key),把hash(key)作为关键字key对应元素的存储地址(或称为散列地址),再进行数据元素的插入和检索。简而言之,散列函数就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

散列表具有固定大小的数组,其中,表长应该为质数。散列函数是用于关键字与存储地址之间的一种映射关系,但是,不能保证每个元素的关键字与函数值是一一对应的,因为极有可能出现对应于不同的元素,却计算除了相同的函数值,冲突指的就是俩个关键字都映射到一个相同的存储地址的情况,即不同关键字可能的到同一散列地址,key1/=key2,儿f(key1) =f(key2)。

应具备特点:

  1. 运算应该尽可能简单。
  2. 函数值域必须在散列表的范围内。
  3. 尽可能减少冲突。

散列表构建方法:

  1. 直接寻址法:h(key)=key,时间复杂度为O(1),空间复杂度为O(n)。直接寻址法不会产生冲突,但由于没有压缩映像,因此,当关键字集合很大时,使用这种hash函数是不可能实现地址编码散列的。
  2. 取模法:选择一个合适的p,令hash(key) = key mod p,如果p选择的是较大的素数效果会比较好,一般p为tableSizes散列表长度。
  3. 数字分析法:设关键字是d位的以r位基的数,共有n个关键字,则关键字可能有r个不同的字符出现,但这r个字符在各个位上出现的频率不一定相同,可能在某些位上分布比较均匀,即每个数符出现的次数接近于n/r,而在另一些位上分布不均匀。因此可选取其中比较均匀的那些位,重新组成新的数,用其作为散列地址。这种方法比较简单,但是要预先直到每个关键字的情况,限制了使用范围。
  4. 折叠法:将关键字分成位数位t的几个部分,最后一部分的位数可能小于t,然后把各个部分按位对齐进行相加,将所得的和舍弃进位,留下t作为散列地址。当关键字位数很多,而且关键字中每位上数字分布比较均匀时,采用折叠法比较合适。
  5. 平方取中法:将关键字进行平方运算,然后从结果中取出若干位(位数与散列地址的位数相同),将其作为散列地址,具体取几位,由散列表的长度决定。
  6. 除留余数法:除留余数法是一种常用的散列函数,其主要原理是取关键字初以某个数p(p不大于散列表的长度)的余数作为散列地址,即(Hash(key) = key%p)p一般取质数,也可以是不包含小于20质因子的合数。
  7. 随机数法:选择一个随机函数(random()),然后使用key的随机数作为散列地址。即Hash(key) = random(key);当关键字长度不相等时,采用这种方法。

在散列表的构造时,不管使用什么样的散列函数,冲突都是不可避免的。解决冲突的主要途径是当一个关键字映射到散列表中的某一个地址,且该地址上已有关键字时,再为关键字寻找新的存储地址。

解决冲突法:

  1. 开放地址法:Hi(Key) = (H(key)+di) mod m(i = 1,2,....,k(k<=m-1))
  2. 链地址法:若散列表空间为[0,m-1] ,则设置一个由m个指针组成的移位数组CH[m],然后在寻找关键字散列地址的过程中,所有散列地址为i的数据元素都插入到头指针为CH[i]的链表中。
  3. 再散列法:当发生冲突时,使用第二个,第三个,散列函数计算地址,直到无冲突为止。这种方法的缺点是计算时间会大幅增加。
  4. 建立一个公共溢出区:假设散列函数的值域为[0,m-1],则设向量Hashhtable[0....m-1]为基本表,另外设立存储空间向量OverTable[0...V]用来存储发生冲突的地址。

 

待续。。。。

 

2.Bit-map法

 

3.Bloom Filter法

 

4.数据库优化法

 

5.倒排索引法

 

6.外排序法

 

7.Trie树

 

8.堆

 

9.双层桶法

 

10.MapReduce法

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 海量数据处理

一个分享Java & Python知识的社区