我们假设一个机器仅存储一个标号为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的平方和的形式。