1.5 快速找出故障机器
1.5 快速找出故障机器
基本问题
1 在某一个时间得到一个数据文件ID的列表,能否快速地找出这个表中仅出现一次的ID
解法:
- 1 使用hashset 在set里判重复即可 time O(N) space O(N)
- 2 使用异或操作 time O(N) space O(1)
- 3 使用sum和操作 time O(N) space O(N)
2 如果已经知道只有一台机器死机(也就是说只有一个备份丢失)呢?如果有两台机器死机呢?(假设同一个数据的两个备份不会同时丢失)
解法:
- 使用sum+multi
\[x+y = a
\]
\[x*y = b
\]
二元二次方程,求出x,y即可
拓展问题
1 如果所有的机器都有3个备份,也就是说同一ID的机器有3台,而且同时又有3台机器死机,还能用上面的解法3解决么?
answer:可以
2 如果有N个备份,而且同时又有N台机器死机,是否还能解决?
answer:不可以
3 给以一副扑克牌,抽走一张,怎么快速找到抽走的一张
answer:使用异或
all coding
// 1.5 快速找出故障机器
import java.util.*;
class Test{
public static void main(String[] args) {
/**
基础问题:
1 在某一个时间得到一个数据文件ID的列表,能否快速地找出这个表中仅出现一次的ID
2 如果已经知道只有一台机器死机(也就是说只有一个备份丢失)呢?如果有两台机器死机呢?(假设同一个数据的两个备份不会同时丢失)
*/
int[] arr = new int[]{1,2,3,4,5,5,4,3,2};
System.out.println(search1(arr));
System.out.println(search2(arr));
System.out.println(search3(arr));
int[] arr2 = new int[]{1,2,3,4,5,5,4,3};
}
/**
基础问题1:
解法:
1 使用hashset 在set里判重复即可 time O(N) space O(N)
2 使用异或操作 time O(N) space O(1)
3 使用sum和操作 time O(N) space O(N)
*/
// 使用hashset
public static int search1(int[] arr){
int res = 0;
Set<Integer> record = new HashSet<Integer>();
for(int i:arr) {
if(record.contains(i)) record.remove(i);
else record.add(i);
}
for(int i:record) res = i;
return res;
}
// 使用异或操作
public static int search2(int[] arr){
int res = arr[0];
for(int i = 1;i<arr.length;i++) res^=arr[i];
return res;
}
// 使用sum和操作
public static int search3(int[] arr){
int sum = 0;
int realSum = (1+2+3+4+5)*2;
for(int i:arr) sum+=i;
return realSum - sum;
}
/**
基础问题2:
使用sum+multi
$$x+y = a$$
$$x*y = b$$
二元二次方程,求出x,y即可
*/
/**
拓展问题:
1 如果所有的机器都有3个备份,也就是说同一ID的机器有3台,而且同时又有3台机器死机,还能用上面的解法3解决么?
answer:可以
2 如果有N个备份,而且同时又有N台机器死机,是否还能解决?
answer:不可以
3 给以一副扑克牌,抽走一张,怎么快速找到抽走的一张
answer:使用异或
*/
}
Saying Less Doing More