關心資料探勘和搜尋引擎的程式設計師都知道,我們需要很多的計算機來儲存和處理海量資料。然而,計算機難免出現硬體故障而導致網路聯絡失敗或宕機。為了保證搜尋引擎的服務質量,我們需要保證每份資料都有多個備份。
簡單期間,我們假設乙個機器僅儲存乙個標號為id的記錄(假設id是小於10億的整數),假設每份資料儲存兩個備份,這樣就有兩個機器儲存了同樣的資料。
1、 在某個時間,如果得到乙個資料檔案id的列表,是否能夠快速找出這個表中僅出現一次的id?
2、 如果已經知道只有一台機器宕機呢?如果有兩台機器宕機呢?
好了說人話,有兩個id表,其中異常的id只會在其中乙個表**現,正常是兩個id表中都有,問假如只有乙個id異常,怎麼找出來?假如有兩個id異常怎麼找出來?
解題思路:
1、 遍歷是肯定可以解決的。
書上列舉了四個方案?在這裡就不一一講解了,挑兩個我覺得比較有意思的說說。
乙個異常id的例子
想想如果機器全部正常的話,id異或值就是0啊,如果只有一台異常,少了乙個和它配對的,那麼剩餘的id異或值是不是就是這個異常的id?
二個異常id的例子
因為正常時候的列表我們是事先知道的,那麼我們了以假設異常的id為x,y。那就有
x+y = 正常和-異常和
x*y=正常乘積/異常積
**示例:
// 尋找乙個異常值
int findoneunnormalid(int *idlist1,int idlist1size,int *idlist2, int idlist2size)
for (int j = 0; j < idlist2size; ++j)
return id;
}// 尋找二個異常值
void findtwounnormalid(int *idlist1, int idlist1size,
int *idlist2,
int idlist2size,
long long sum,
long long product,
int x,
int y)
for (int j = 0; j < idlist2size; ++j)
int dvalue_add = sum - addsum;
int dvalue_mul = product / mux;
for (int i = 0; i < dvalue_add; ++i)
}}}
程式設計之美 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 如果有兩台機...