BCZM : 1.5
https://blog.csdn.net/zs634134578/article/details/18046317
有很多服务器存储数据,假设一个机器仅存储一个标号为ID的记录,假设机器总量在10亿以下且ID是小于10亿的整数,假设每份数据保存两个备份,这样就有两个机器存储了同样的数据。
问题:
1.假设在某个时间得到一个数据文件ID的列表,是否能快速地找出表中仅出现一次的ID?即快速找出出现故障的机器存储的数据ID。
2.如果有两台机器出现故障呢?(假设存储同一份数据的两台机器不会同时出现故障,即列表中缺少的是两个不等的ID
问题转化:
有很多的ID,其中只有一个ID出现的次数小于2,其他正常ID出现的次数都等于2,问如何找到这个次数为1的ID.
解法一:暴力解决
方法:遍历列表,利用一个map记下每次出现的ID和出现次数+1,遍历完毕之后,出现次数小于2的ID就是我们想要的结果。
时间复杂度:O(N)
空间复杂度:O(N)
缺点:当记录N多达几G甚至几十G时,空间复杂度将会成为瓶颈。
解法二:两次即删
方法:遍历列表,利用变长数组记录每个ID,每次遇到一个ID,就向变长数组中增加一个元素,如果这个ID出现的次数为2,那么就从变长数组中删除这个ID, 最后变长数组中剩下的ID就是我们寻找的ID。
时间复杂度:O(N)
空间复杂度:最好O(1),最坏O(N)
解法三:异或运算
思路:摒弃遍历列表技术方式
目标:把空间复杂度降低到常数甚至为1的级别,即使用一个变量来记录遍历列表的结果
构造函数:
x(i) = f(List[0], List[1], List[2], ... , List[i])
即:这个变量是已经遍历过的列表元素的函数
该函数需要满足的条件:x(N) = ID_LOST
运算:异或
性质:X 异或 X = 0, X 异或 0 = X, 异或操作满足交换率和结合律
方法:所以的ID的异或值就等于这个仅出现一次的ID。
时间复杂度:O(N)
空间复杂度:O(1)
解法四:寻找不变量
方法:所有ID的和是不变的,所以用所有ID的和减去现有ID的和即得丢失的ID。
时间复杂度:O(N)
空间复杂度:O(1)
缺点:不适用于丢失多个ID的情况
问题进阶一:当有两个ID的机器一起出现故障,确定出现故障的机器
如果缺少的两个ID不相同
解法:异或运算
对所有ID进行异或运算,结果为a(不等于0)
确定a的某一个为1的二进制位置b
将所有ID分为两组:二进制位置b为1的为一组A,二进制位置为0的为一组B
对AB两组分别进行异或运算,得到两个不为0的数字,即为丢失的两个ID
如果不能确定缺少的两个ID是否相同
解法一:
因为已知丢失两个数是相同的,所以通过上面的解法四可以得到 x + y = a, x * 2 = a, x = a/2
当然,这种方法是建立在已知两个数是相同的前提下的。
解法二:(通用解法,对丢失N个数的情况同样适用)
如果不知道两个数是否相同,可以通过建立方程组来解决
解法一已经给出了一个方程组: x+y=a
那么再计算丢失前后的所有ID的平方和,进行相减,可以又得到一个方程: x^2 + y^2 = b
联立方程组即可求解。
问题进阶二:当有多个ID的机器一起出现故障,确定出现故障的机器
解法一:
参考问题进阶一解法二。
缺点:当N过大时,N个方程组不易求解。
解法二:
参考解法二,遍历+计数+两次即删。
参考:
http://blog.csdn.net/insistgogo/article/details/7687936
BCZM : 1.5的更多相关文章
- BCZM: Chapter 2
2.1 二进制数中 1 的个数 实现一个函数,输入一个无符号整数,输出该数二进制中的1的个数.例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2 分析与解法 解法1:利用十进制和 ...
- BCZM: Chapter 1
1.1 CPU 占用率 https://www.cnblogs.com/TenosDoIt/p/3242910.html 1.2 中国象棋将帅 https://blog.csdn.net/kabini ...
- BCZM : 2.1
1.问题描述 实现一个函数,输入一个无符号整数,输出该数二进制中的1的个数.例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2 2.分析与解法 解法1:利用十进制和二进制相互转化 ...
- BCZM : 1.16
24点游戏 解法一:穷举法 解法二:分治法
- BCZM : 1.15
数独 解法一:广度优先搜索. 解法二:先填满中间矩阵,其他区域通过矩阵置换求出.
- BCZM : 1.9
有n个学生参加见面会,分别对m个研究组中的若干个感兴趣,为了满足所有学生的要求,每个学生都能参加自己感兴趣的见面会,如果每个见面会的时间为t,如何安排才能使得所有见面会的总时间最短? 分析: 先建立模 ...
- BCZM : 1.8
问题: 所有的员工均在1楼进电梯的时候,选择所要到达的楼层.然后计算出停靠的楼层i,当到达楼层i的时候,电梯停止.所有人走出电梯,步行到所在的楼层中.求所有人爬的楼层数目和的最小值. 解法一 ...
- BCZM : 1.7
光影切割 在一个平面内有一个矩形区域,直线穿过矩形可以将其分割为不同的区域,且在这个平面中不存在三条直线相交一点的情况.求当有N条直线穿过矩形时,它被分割为多少个区域? 解法一: 平面倍划分 ...
- BCZM : 1.6
https://blog.csdn.net/kabini/article/details/2311946 题目大意: 水房能容纳饮料的总量是V,有一批饮料,每种饮料单个容量都是2的方幂,每种饮料信息如 ...
随机推荐
- ImsConference.java中会议成员更新处理详解
public class ConferenceParticipant implements Parcelable { //自定义数据结构 private static final String ANO ...
- yield迭代器的使用
class Program { static void Main(string[] args) { List<Student> students = new List<Student ...
- RTL_PROCESS_MODULE_INFORMATION
typedef struct _RTL_PROCESS_MODULE_INFORMATION { HANDLE Section; // Not filled in PVOID MappedBase; ...
- js中的Array数组清空
var data = new Array();//数组 data.length = 0;//数组的长度等于0,数组的项就会被清空
- pandas-append()
DataFrame.append(self,other,ignore_index = False,verify_integrity = False,sort = Nore) 作用是将其他对象附加到调用 ...
- react 使用react-router-dom 在Route对象上component 参数接收的是一个方法而非一个对象
其实对于jsx语法 一直觉的它有点清晰都不是很好,js和html混在一起有点不伦不类的样子,以下是我在使用react中遇到的一个很奇葩的事情 假定你定义了一个component Mine import ...
- Razor页面之添加TagHelper
1.右键项目-----添加------新建项 2.创建Razor试图导入 (Razor View Imports) 3.在创建的_ViewImports.cshtml中添加 @AddTagHelpe ...
- R语言 运算符
R语言运算符 运算符是一个符号,通知编译器执行特定的数学或逻辑操作. R语言具有丰富的内置运算符,并提供以下类型的运算符. 运算符的类型 R语言中拥有如下几种运算符类型: 算术运算符 关系运算符 逻辑 ...
- noip 2014 总结
2014 年的noip 已经结束了,成绩从个人而言不是特别的理想,从今年题的逗的程度,本来是个xxx 就被玩脱了= = 当然现在后悔事没有用的了,不过第二天全屏技术的在最后一小时看到了两道题的错误,然 ...
- POJ2449-A*算法-第k短路
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 题意:传送门 原题目描述在最下面. 给你一个有向图,求指定节点间的第k短路. 思路: 先反向跑出从终点开始的到每个节点的最短距离 ...