1 5快速找出故障機器

2022-09-13 19:42:14 字數 833 閱讀 2947

關心資料探勘和搜尋引擎的程式設計師都知道,我們需要很多的計算機來儲存和處理海量資料。然而,計算機難免出現硬體故障而導致網路聯絡失敗或宕機。為了保證搜尋引擎的服務質量,我們需要保證每份資料都有多個備份。簡單起見,假設每個機器儲存乙個標號為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的乘積是有多大?!

程式設計之美 1 5 快速找出故障機器

解法3 使用異或 問題1 找出出現奇數次的兩個數 void findrepeatedtwonumbers int a,int n,int no1,int no2 temp的值現為兩個出現奇數次的數的異或 找第乙個為1的位 for j 0 j sizeof int 8 j 第j位為1,說明這兩個數字在...

程式設計之美 1 5 快速找出故障機器

題目 假設乙個機器只儲存乙個標號為id的記錄,假設每份資料儲存2個備份,這樣就有2個機器儲存了相同的資料。其中id是小於10億的整數 問題1 在某個時間,如果得到乙個資料檔案id的列表。是否能夠快速的找到這個表中僅出現一次的id?即快速找出出現故障的機器儲存的資料id。問題2 如果有兩台機器宕機呢?...

程式設計之美1 5 快速找出故障機器

題目 假設乙個機器只儲存乙個標號為 id的記錄,假設每份資料儲存 2個備份,這樣就有 2個機器儲存了相同的資料。其中id是小於10億的整數 問題1 在某個時間,如果得到乙個資料檔案 id的列表。是否能夠快速的找到這個表中僅出現一次的 id?即快速找出出現故障的機器儲存的資料id。問題2 如果有兩台機...