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

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

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