海量数据处理:算法

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

在海量数据中提取信息,不同于常规量级数据中提取信息,在海量信息中提取有用数据,会存在以下几个方面的问题:
(1)数据量过大,数据中什么情况都可能存在,如果信息数量只有20条,人工可以逐条进行查找、比对,可是当数据规模扩展到上百条、数千条、数亿条,甚至更多时,仅仅只通过手工已经无法解决存在的问题,必须通过工具或者程序进行处理。
(2)对海量数据信息处理,还需要有良好的软硬件配置,合理使用工具,合理分配系统资源。通常情况下,如果需要处理的数据量非常大,超过了TB级,小型机、大型工作站是要考虑的,普通计算机如果有好的方法也可以考虑,如通过联机做成工作集群。
(3)对海量信息处理时,要求很高的处理方法和技巧,如何进行数据挖掘算法的设计以及如何进行数据的存储访问等都是研究的难点。

针对海量数据的处理,可以使用的方法非常多,常见的方法有Hash法、Bit-map法、Bloom filter法、数据库优化法、倒排索引法、外排序法、Trie树、堆、双层桶法以及MapReduce法。

Hash法

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

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

哈希函数的特点

哈希函数一般应具备以下几个方面的特点:
(1)运算应该尽可能简单
(2)函数的值域必须在散列表的范围内
(3)尽可能的减少冲突

哈希函数的构建方法

哈希函数的构建方法一般有以下几种:
(1)直接寻址法
取关键字或关键字的某个线性函数值为散列地址。即h(key)=key或h(key)=a*key+b,其中a和b均为整型常数,这种散列函数叫做自身函数。例如,有一个人口数字统计表,人的年龄取值范围为1~100岁,其中,年龄作为关键字,哈希函数取关键字自身,但这种方法效率比较低,时间复杂度O(1),空间复杂度为O(n),n为关键字的个数。

直接寻址法不会产生冲突,但由于它没有压缩映像,因此当关键字集合很大时,使用这种Hash函数是不可能实现地址编码的散列的。

(2)取模法
选择一个合适的正整数p,令hash(Key) = key mod p。p如果选择的是比较大的素数,则效果比较好,一般选取p为TableSize,即哈希表的长度。

(3)数字分析法
设关键字是d位的以r为基的数(如以10为基的十进制数),且共有n个关键字。则关键字的每个位可能有r个不同的数符出现(即0,1,2,。。。,9),但这r个数符在各个位上出现的频率不一定相同,可能在某些位上分布比较均匀,即每个数符出现的次数接近于n/r,而在另一些位上分布不均匀。因此可选取其中分布较均匀的,重新组成新的数,用其作为哈希地址。
这种方法简单、直观,但是需要预先知道每个关键字的情况,这就限制了它的使用范围。

(4)折叠法
将关键字分成位数为t的几个部分(最后一部分的位数可能小于t),然后把各部分按位对齐进行相加,将所得的和舍弃进位,留下t位作为哈希地址。当关键字位数很多,而且关键字中每位上数字分布比较均匀时,采用折叠法比较合适。

(5)平方取中法
这是一种较常用的方法,将关键字进行平方运算,然后从结果的中间取出若干位(位数与散列地址的位数相同),将其作为散列地址,具体取几位由哈希表的表长决定。

(6)除留余数法
除留余数法是一种比较常用的哈希函数,它的主要原理是取关键字除以某个数p(p不大于哈希表的长度TableSize)的余数作为哈希地址,即Hash(key)=key%p
使用除留余数法时,选取合适的p值很重要,一般要求p<=TableSize,且接近TableSize,p一般选取质数,也可以是不包含小于20质因子的合数

(7)随机数法
选择一个随机函数,然后用关键字key的随机函数值作为哈希地址,即Hash(key)=random(key)

解决冲突的方法

解决冲突的主要途径是当一个关键字映射到哈希表中的某一个地址且该地址上已有关键字时,再为该关键字寻找新的存储地址。

(1)开放地址法

基本思想是当发生地址冲突时,在哈希表中再按照某种方法继续探测其他的存储地址,直到找到空闲的地址为止

Hi(key)=(H(key
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值