编程之美1.5 快速找出故障机器

     关心数据挖掘和搜索引擎的程序员都知道,我们需要很多的计算机来存储和处理海量数据。然而,计算机难免会有硬件故障而导致网络联系失败或死机。为了保证搜索引擎的服务质量,我们需要保证每份数据都有多个备份。
     为了简单起见,我们假设一个机器仅储存一个标号为 ID 的纪录(假设 ID 是小于 10 亿的整数)假设每份数据保存两个备份,这样就有两个机器储存了同样的数据。 
      1. 在某个时间,如果得到一个数据文件 ID 的列表,是否能够快速地找出这个表中仅出现一次的 ID? 
      2. 如果已经知道只有一台机器死机(也就是说只有一个备份丢失)呢?如果有两台机器死机呢(假设同一个数据的两个备份不会同时丢失)?

分析:
     这个问题简化一下就是,给定个ID列表,有一个ID仅出现一次,其余的都出现了2次,如何快速找到这个只出现一次的ID。第二问就是,如果有两个ID出现一次,如何快速找到这两个ID。最简单的办法是遍历一遍记录每个ID的次数,但是这类问题都需要考虑假如数据量非常大怎么办的问题,数据量非常大时,可能一个长度为ID数量的数组都会存不下。
     这个题目的优化方法比较多。假如只有一台受损,那么可以使用异或运算进行操作,遍历每个ID并计算已遍历过的数据的亦或值,遍历完成之后得到的就是那个仅有一个的ID。但是这个方法不适合有两台机器死机的情况。两台机器死机的情况下,可以这样改进这个算法,先进行一次遍历异或运算,得到的值为这两台机器的异或值,由于这两个机器不同,那么至少有一位为1,可以根据这位的值把数分成两组,分别异或,得到的就是这两台机器的ID。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值