題目:假設乙個機器只儲存乙個標號為id的記錄,假設每份資料儲存2個備份,這樣就有2個機器儲存了相同的資料。其中id是小於10億的整數
問題1、在某個時間,如果得到乙個資料檔案id的列表。
是否能夠快速的找到這個表中僅出現一次的id?即快速找出出現故障的機器儲存的資料id。
問題2、如果有兩台機器宕機呢?(假設同乙個資料的倆個備份不會同時丟失,
即列表中缺少的是兩個不等的id)
擴充套件題、如果所有的機子都有三個備份,也就是說同一id的機子有三颱。
而且同時又有三颱機子宕機,還能用上面的方法解決嗎?
如果有n臺備份,又同時有n臺機器宕機呢?
相關問題、給你一副雜亂的撲克牌(不包括大小王),任意從其中抽出一張牌,
怎樣用最簡單的方法來知道抽出的是1~13中的那一張?(不要求知道花色)
對於列表中的每乙個id,遍歷列表查詢是否存在相同的id,利用陣列記錄每個id出現的次數,
遍歷完,次數小於2的就是要找的;
時間複雜度為o(n),空間複雜度為o(n)。空間複雜度在n很大時不理想。
利用hash表。遍歷列表,對於每乙個id,先檢查hash表中是否有與之相同的id,
若有,則從hash表中刪除該id;否則,將該id加入到hash表中。
這樣,遍歷完列表後,hash表中剩下的那乙個元素即為所求id。
時間複雜度為o(n),空間複雜度在最好的情況下為o(1),在最壞的情況下為o(n)。
利用異或運算,因為所以id出現2次,只有乙個出現一次,而a^a=0,
所以將這個列表中的所有id異或後的值即為所求id。
時間複雜度為o(n),空間複雜度為o(1)。在時間和空間上,基本已經達到最優。
若是有2個id僅出現一次,設為a和b,那麼所有id的異或值為a^b,無法確定a與b的值;
但是仍然可以找到,若a=b,a^b=0,則可以通過求和的方法a=b=(所有id和-所以正常工作id和)/2
若a!=b,a^b!=0,那麼這個值最高為1,顯然a與b當中有且只有乙個數的相同位為1;
所以根據這一位,我們可以將a和b分開,並將數分成兩組。
我們在結果數字中找到第乙個為1的位的位置,記為第n位。
現在我們以第n位是不是1為標準把原陣列中的數字分成兩個子陣列,
第乙個子陣列中每個數字的第n位都為1,第二個子陣列的每個數字的第n位都為0。
所以把第n位為1的異或 結果num1, 把第n位為1的異或 結果num1,
#includeusing namespace std;
void findtwodifferentnum(int a,int n,int &num1,int &num2)
//返回陣列a中兩個只出現一次的數字num1和num2
ans=num1;
for(i=0;i>count)&1)
num1^=a[i];
} num2=num1^ans;//num1和全部異或的結果異或,就是num2
}int main()
; int num1, num2;
findtwodifferentnum(a,sizeof(a)/sizeof(int),num1,num2);
cout《利用「不變數」。所有id的和為乙個不變數,對剩下id求和。
所有id的和與剩下id的和之差即為所求id。
由於所有id之和可以事先算好,所以,該方法也可以在o(n)時間,o(1)空間內解決。
問題2,用2個方程解決
首先計算出初始未丟失之前,所有id之和。
然後計算出丟失之後的id之和,然後(1)(2)結果進行相減操作,得到方程x+ y = a。
利用丟失前後平方和之差,來與(2)進行聯立,得到方程x*x+y*y=b。
對兩方程進行聯立,即可以求出最終的結果。
如果同時有a個備份,同時有b臺機器發生故障,怎麼解決?
在b小於4的情況下,還可以考慮採用解法四構造方程解決。
但是,b超過4的情 況下,方程勢必很複雜,建議採用解法三,當然,解法三需要改進。
需要對存入hash表的id計數,當計數值達到a時再將這個id從hash表中刪除。
給你一副雜亂的撲克牌(不包括大小王),任意從其中抽出一張牌,
怎樣用最簡單的方法來知道抽出的是1~13中的那一張?(不要求知道花色)?
直接採用解法四;
首先算好所有牌的和(1+...+13)x4=364,然後分別減去留下的牌點數,就得到抽出的是哪一張。
程式設計之美 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的記錄 假設id是小於10億的整數 假設每份資料儲存兩...