1.5快速找出故障机器

    关心数据挖掘和搜索引擎的程序员都知道,我们需要很多的计算机来存储和处理海量数据。然而,计算机难免出现硬件故障而导致网络联系失败或死机。为了保证搜索引擎的服务质量,我们需要保证每份数据都有多个备份。简单起见,假设每个机器存储一个标号为ID的记录(ID是小于十亿的整数),假设每份数据都保存两个备份,这样就有两个机器储存了同样的数据。
问:
    1.在某个时间,如果得到一个数据文件ID的列表,是否能够快速地找出这个表中仅出现一次的ID?
    2.如果已经知道只有一台机器死机(也就是说只有一个备份丢失)呢?如果有两台机器死机呢(假设同一个数据的两个备份不会同时丢失)?
 
 
解法1:直接哈希,最笨、最实在的方法。
 
解法2:位运算(位运算往往有降低空间复杂度的奇效)
    题目的意思可抽象为“在一个整数集中找出一个独一无二的数(其余数都是成对出现)”,考虑到x^x=0,x^0=x。
    对于①问,直接将所有的数异或,最后的结果即为答案。
    对于②问,分2种情况:I若总异或结果为0,表示丢失的2个ID相同。II若不为0,则设丢失的2数为A、B,那么A、B中必有某位是不相等的(在该位上要么A=1,B=0,要么A=0,B=1),将所有的ID按在该位上数为1或0分为X、Y两组,那么,X组所有的数异或结果和Y组所有数的异或结果即为答案。
    本解法非常之巧妙,新思想啊~不过,具体实现有点繁琐
 
解法3:解方程。设丢失的2数为x,y
    记丢失前所有的ID总和为A,丢失后所有ID总和为B,那么x+y=A-B ①
    丢失前所有ID乘积为A,丢失后所有ID乘积为B,那么xy=A/B ②
    ①②联立,即可解得答案
    本解法锻炼创新思维,打破思维惯势,非常巧妙。有个小问题:ID规模是10^9,所有ID的乘积是有多大?!
 
posted @ 2013-08-05 18:59  icfnight  Views(202)  Comments(0Edit  收藏  举报