jake1036

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

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

题目大意是这样的:有很多服务器存储数据,假设一个机器仅存储一个标号为ID的记录,假设机器总量在10亿以下且ID是小于10亿的整数,

假设每份数据保存两个备份,这样就有两个机器存储了同样的数据。

问题是:1.假设在某个时间得到一个数据文件ID的列表,是否能快速地找出表中仅出现一次的ID?

             即快速找出出现故障的机器存储的数据ID。

          2.如果有两台机器出现故障呢?(假设存储同一份数据的两台机器不会同时出现故障,

              即列表中缺少的是两个不等的ID)

  问题分析1:
    首先考虑ID队列中只有一个数字出现一次,其余的数字均出现两次。
    此时就可以借助异或运算符进行计算,a ^ a = 0 , 0^a =a 。
    方法: 我们从数组的第一个元素开始,一直进行两两异或操作,则最后的结果即为缺失的机器ID。
 
 问题2分析:
    若是ID队列中缺少了两个数字,我们首先假设这两个数字不相同,我们采取的方法是,依次进行异或操作,
    则最后的结果不为0,设结果为a。则我们获得a的二进制表示中,最低一位为1的位置,设该位置为b。
    我们根据b位是否为1,将原来的id队列,划分为两个队列。
   其中一个队列中的b位为1,另一个队列中的b位为0。然后对两个分队列,分别进行异或操作,则将得到
   两个不为0的数字。此两个数字,即为所丢失的ID。

  方法2:
    若丢失的两个ID是相同的,则我们无法使用上述方法。
    此时我们采取的方法如下:
   (1)首先计算出初始未丢失之前,所有ID之和。
   (2)然后计算出丢失之后的ID之和,然后(1)(2)结果进行相减操作,则获得的即为x+ y = a的值。
   (3)我们还需要一个方程来求取x和y的值,我们可以用平方和来进行计算。
   (4)利用丢失前后平方和之差,来与(2)进行联立,来求取x和y的值。x * x + y * y = b的值/
   (5) 对方程(2)(4)进行联立,即可以求出最终的结果。

 三 相似问题
     从一副扑克牌中(无大小王),抽取出一张牌,我们进行快速的判断,来猜测这些抽取的是哪张牌。
 
 四 问题加深
     若是每个id,三个电脑存储,丢失了3个id,则是否还能使用上述方法,得出最后的结果。
      则我们需要建立三个方程,可以利用所有的数,前后相乘的积,来建立第三个方程。
    若是N个id呢,只需要建立n个方程,即可达到目的。    


posted on 2011-06-24 14:57 kahn 阅读(599) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理