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

2021-06-27 03:54:43 字數 2177 閱讀 1822

題目:假設乙個機器只儲存乙個標號為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億的整數 假設每份資料儲存兩...