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:使用异或

	*/
}
posted @ 2020-11-30 11:42  BOTAK  阅读(92)  评论(0编辑  收藏  举报