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的方幂,每种饮料信息如 ...
随机推荐
- springboot上传图片大小限制
背景:springboot项目上传图片超过1M报错,经了解,springboot默认上传文件1M 需求:更改默认配置,控制上传文件大小 方法:①更改配置文件(经试验不可行,不知道为什么):②更改启动B ...
- JHipster研究
liquibase工作原理: master.xml用来维护所有变更记录文件引用 changelog文件夹用来保存具体的变更细节 系统启动时会比较master.xml中include的file,应用差异 ...
- Spring Boot Restful WebAPI集成 OAuth2
系统采用前后端分离的架构,采用OAuth2协议是很自然的事情. 下面开始实战,主要依赖以下两个组件: <dependency> <groupId>org.springframe ...
- Linux基本知识点
压缩和解压类 7.8.1 gzip/gunzip 压缩 1.基本语法 gzip 文件 (功能描述:压缩文件,只能将文件压缩为*.gz文件) gunzip 文件.gz (功能描述:解压缩文件命令) 2. ...
- find out the installed and runing tomcat version in Linux
To find out the Tomcat version, find this file – version.sh for *nix or version.bat for Windows. Thi ...
- 代码托管平台--GitHub 使用小结
一.GitHub介绍 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一的版本库格式进行托管.在GitHub,用户可以十分轻易地找到海量的开源代码. 很多IT行业的人到求职的 ...
- 利用ffmpeg进行视频软解播放
前段时间,公司的一个项目需要一个rtsp的播放库,原本打算直接用vlc播放的,但我觉得vlc太庞大了,很多功能没必要,还不如用ffmpeg+d3d简单的实现一个库,因此就有了今天讲的这个东西.一个解码 ...
- 关于元素的offsetHeight、line-htight
最近在做一个自适应高度的加载时的瀑布效果,使用加载完毕后为其一个A容器设置style的高度的方式完成(原高度为0且超出部分裁剪),使用offsetHeight获取其子元素高度(所有子元素高度均相等), ...
- delphi xe10 麦克风、摄像头操作
TakePhotoFromCameraAction1: TTakePhotoFromCameraAction; // 通过手机摄像头获取图片TakePhotoFromLibraryAction1: T ...
- QueryList采集页面链接及对应标题
<?php header('content-type:text/html;charset=utf-8'); require 'vendor/autoload.php'; use QL\Query ...