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

我们假设一个机器仅存储一个标号为ID的记录(假设ID是小于10亿的整数),假设每份数据保存两个备份,这样就有两个机器储存了同样的数据。

1.在某个时间,如果得到一个数据文件ID的列表,是否能够快速地找出这个表中仅出现一次的ID?

2.如果已经知道只有一台机器死机(也就是说只有一个备份丢失)呢?如果有两台机器死机呢?

首先解决仅有一台机器死机:

解法一:

遍历列表,统计每个ID出现的次数。时间复杂度O(N),空间复杂度O(N)。

解法二:

遍历列表,统计每个ID出现的次数,若某个ID出现次数为2,清空。时间复杂度O(N),空间复杂度最好O(1),最差O(N)。

解法三:

遍历列表,对每个ID进行异或运算,X异或X=0,X异或0=X,异或运算满足交换律和结合律,最终得到的值就是丢失的ID。

对于两台机器死机:

若两个ID相同,即异或结果为0,对所有的ID进行求和,与未丢失ID前的ID之和相减,得到的2*丢失的ID。

若两个ID不同,即异或结果不为0,那么这个异或值的某一位是1,则两个ID,A,B,必然是这一位一个是1,一个是0。根据这一位是1还是0,将ID分为两类,分别进行异或运算,最终得到的两个异或值就是A和B。

另一种解法:

对于两个ID不同的情况,可以采用所有的ID进行求和,与未丢失ID前的ID之和相减这种方式,得到A+B=x。同时,还可以采用所有ID相乘的形式,得到A*B=y。两个方程联立可以求解A和B。若考虑溢出问题,那么可考虑采用ID的平方和的形式。

    原文作者:leogo17
    原文地址: https://blog.csdn.net/leogo17/article/details/81813143
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞