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的更多相关文章

  1. BCZM: Chapter 2

    2.1 二进制数中 1 的个数 实现一个函数,输入一个无符号整数,输出该数二进制中的1的个数.例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2 分析与解法 解法1:利用十进制和 ...

  2. BCZM: Chapter 1

    1.1 CPU 占用率 https://www.cnblogs.com/TenosDoIt/p/3242910.html 1.2 中国象棋将帅 https://blog.csdn.net/kabini ...

  3. BCZM : 2.1

    1.问题描述 实现一个函数,输入一个无符号整数,输出该数二进制中的1的个数.例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2 2.分析与解法 解法1:利用十进制和二进制相互转化 ...

  4. BCZM : 1.16

    24点游戏 解法一:穷举法 解法二:分治法

  5. BCZM : 1.15

    数独 解法一:广度优先搜索. 解法二:先填满中间矩阵,其他区域通过矩阵置换求出.

  6. BCZM : 1.9

    有n个学生参加见面会,分别对m个研究组中的若干个感兴趣,为了满足所有学生的要求,每个学生都能参加自己感兴趣的见面会,如果每个见面会的时间为t,如何安排才能使得所有见面会的总时间最短? 分析: 先建立模 ...

  7. BCZM : 1.8

    问题:      所有的员工均在1楼进电梯的时候,选择所要到达的楼层.然后计算出停靠的楼层i,当到达楼层i的时候,电梯停止.所有人走出电梯,步行到所在的楼层中.求所有人爬的楼层数目和的最小值. 解法一 ...

  8. BCZM : 1.7

    光影切割 在一个平面内有一个矩形区域,直线穿过矩形可以将其分割为不同的区域,且在这个平面中不存在三条直线相交一点的情况.求当有N条直线穿过矩形时,它被分割为多少个区域? 解法一:      平面倍划分 ...

  9. BCZM : 1.6

    https://blog.csdn.net/kabini/article/details/2311946 题目大意: 水房能容纳饮料的总量是V,有一批饮料,每种饮料单个容量都是2的方幂,每种饮料信息如 ...

随机推荐

  1. centos7.5下生成公钥,实现ssh免密钥登陆

    配置SSH无密码登录需要4步准备工作生成公钥和私钥导入公钥到认证文件,更改权限测试1. 准备工作确认本机sshd的配置文件(需要root权限) # vi /etc/ssh/sshd_config 1找 ...

  2. mysql动态列--统计报表信息对比

    SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(tmp.summary = ''', tp.summary, ''', tm ...

  3. [已解决]报错This event loop is already running

    安装nest_asyncio pip install nest_asyncio 导入并调用 import nest_asyncio nest_asyncio.apply()

  4. 33-Ubuntu-用户权限-04-修改目录权限

    修改目录权限 例:test 1.可执行权限---x 减少目录x权限,无法切换到该目录 chmod -x test 2.读权限 ---r 减少目录r权限,无法读取(ls)目录信息 chmod -r te ...

  5. 数据可视化echart

    刚接到这个一脸懵逼,到现在还算有点眉目,先上个图庆祝一下,哈哈,开心.... 最近没时间,等待更新..........

  6. json转字符串,json转list,json转pojo的工具类

    package com.loveshop.util; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingEx ...

  7. 如何清除Windows共享登录的用户名密码

    打开cmd 1.[查看已记录的登录信息] net use 2.[清除记录] 得关掉你所有打开的samba之后再 net use * /del

  8. MYSQL分数排名

    编写一个 SQL 查询来实现分数排名.如果两个分数相同,则两个分数排名(Rank)相同.请注意,平分后的下一个名次应该是下一个连续的整数值.换句话说,名次之间不应该有“间隔”. +----+----- ...

  9. Web响应的提高

    想象一下,如果用户在页面上触发一个点击事件,结果反应延迟比较明显,这将是一个令人沮丧的事情.而造成这个问题的原因就是响应延迟. 浏览器UI 线程 大家都知道浏览器的UI线程,大多数浏览器都是一个独立的 ...

  10. CSS控制Span强制换行、溢出隐藏

    CSS控制Span强制换行 word-wrap: break-word; word-break: break-all; white-space: pre-wrap !important; 盒子文字设置 ...