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

2022-06-28 14:24:15 字數 967 閱讀 6060

問題:假設一台機器僅儲存乙個標號為id的記錄,每份資料有兩個備份,分別儲存到兩台機器中。

1.在某個時間,如果得到乙個資料檔案id列表,能否快速找出僅出現一次的id?

2.如果已經知道只有一台機器宕機呢?如果有兩台機器宕機呢?

(假設同一資料兩個備份不會同時丟失)

解法一:

遍歷id列表,記錄各id的出現次數。 空間複雜度:o(n) 時間複雜度:o(n)

解法二:

解法一的改進,利用變長陣列,如果出現2次刪除這個id,空間複雜度最好時o(1),最壞時o(n)

解法三:

異或運算xor

對於第一問,遍歷完id列表得到的運算結果即為僅出現一次的id;

對於第二問,若有兩台機器宕機且id不相同,設它們為a與b,異或運算最終得出的是result=a xor b的值,無法確定a與b的值。顯然這result中某一位為1時,a與b中有且僅有乙個數在這一位上也為1。這樣我們就可以將所有的id分為兩類,一類在這位上為1,另一類這位上為0。每一類分別含a與b中的乙個,只需分別對這兩類id做異或運算即可。

例:11 8 11 7 10 12 10 12  result=15

a類(第一位為1):11 11 7

b類(第二位為0):8 10 12 10 12

這解法的缺陷是若兩台機器宕機id相同就無法檢測出來。

解法四:

避免了解法三的缺陷,利用數學中「不變數」的概念,例如預先儲存所有id之和與所有id之積。

對於兩台機器宕機的話,就可以列出如下方程:

x+y=a

xy=b

不過實現上可能會有問題,就是大整數乘法造成算術溢位,可以嘗試通過採用平方和來解決。

程式設計之美 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 如果有兩台機...