zoukankan      html  css  js  c++  java
  • 1.5快速找出故障机器

        关心数据挖掘和搜索引擎的程序员都知道,我们需要很多的计算机来存储和处理海量数据。然而,计算机难免出现硬件故障而导致网络联系失败或死机。为了保证搜索引擎的服务质量,我们需要保证每份数据都有多个备份。简单起见,假设每个机器存储一个标号为ID的记录(ID是小于十亿的整数),假设每份数据都保存两个备份,这样就有两个机器储存了同样的数据。
    问:
        1.在某个时间,如果得到一个数据文件ID的列表,是否能够快速地找出这个表中仅出现一次的ID?
        2.如果已经知道只有一台机器死机(也就是说只有一个备份丢失)呢?如果有两台机器死机呢(假设同一个数据的两个备份不会同时丢失)?
     
     
    解法1:直接哈希,最笨、最实在的方法。
     
    解法2:位运算(位运算往往有降低空间复杂度的奇效)
        题目的意思可抽象为“在一个整数集中找出一个独一无二的数(其余数都是成对出现)”,考虑到x^x=0,x^0=x。
        对于①问,直接将所有的数异或,最后的结果即为答案。
        对于②问,分2种情况:I若总异或结果为0,表示丢失的2个ID相同。II若不为0,则设丢失的2数为A、B,那么A、B中必有某位是不相等的(在该位上要么A=1,B=0,要么A=0,B=1),将所有的ID按在该位上数为1或0分为X、Y两组,那么,X组所有的数异或结果和Y组所有数的异或结果即为答案。
        本解法非常之巧妙,新思想啊~不过,具体实现有点繁琐
     
    解法3:解方程。设丢失的2数为x,y
        记丢失前所有的ID总和为A,丢失后所有ID总和为B,那么x+y=A-B ①
        丢失前所有ID乘积为A,丢失后所有ID乘积为B,那么xy=A/B ②
        ①②联立,即可解得答案
        本解法锻炼创新思维,打破思维惯势,非常巧妙。有个小问题:ID规模是10^9,所有ID的乘积是有多大?!
     
  • 相关阅读:
    android手机推送消息 (百度云推送)
    android小功能:checkbox使用自己的背景点击切换背景
    Android中的通知—Notification
    Android判断网络状态
    android简单的夜间模式
    Xutils请求服务器json数据与下载文件
    Android第三方登录详解2
    stackstorm docker中配置ssh免密码登录方式
    scrapy 采集网页出现丢失url的问题
    pandans导出Excel并将数据保存到不同的Sheet表中
  • 原文地址:https://www.cnblogs.com/icfnight/p/3238850.html
Copyright © 2011-2022 走看看