快速找出故障机器
每个机器中存储一个ID,每个ID分别在两个机器中存储,若机器故障,则少一个ID。
问题转换:有很多ID。(1)其中只有一个ID出现的次数少于2,其他都正常出现2次;
(2)其中两个ID仅出现一次,其他都正常出现2次。
目标:找到仅出现一次的机器ID。
解析:
1. 使用链表,直接遍历列表,用一个数组记录下每个ID出现的次数,最后出现次数为1的的就是我们要找的ID。
时间复杂度O(N),空间复杂度O(N)。
2.使用Hash表,一次读取ID号,若出现两个ID号相同,则删除该ID(该ID出现两次,他正常),最后HASH表中
剩余的ID号就是要找的ID。 时间复杂度O(N),空间复杂度最坏情况下为O(N),最好的情况下为O(1)。
3.使用函数法,函数的值为ID号。
(1)依次将各个ID做异或操作,最后留下的函数值即为出现一个的ID;
(2)若有两个ID都值出现一次,则异或后的值为两个丢失ID的异或值,这是需要寻找某位为1,根据该位将所有ID
分为两部分,一部分该位为1,一部分该位为0,两部分分别在做异或,得到的两个值即为丢失的两个ID号。
时间复杂度O(N),空间复杂度O(1)
题外话:若丢失的两个ID号相同,则上述方法不可行。
若两个相同的ID丢失后,则需要用借助外部信息。
例如:事先得到所有ID的和、积、平方和等信息值。
(1)和减去所有存在ID值,余下的差值即为丢失ID值。
丢失两个ID,需要列两个方程,解方程即可。