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

2021-09-09 05:46:52 字數 1238 閱讀 9470

關心資料探勘和搜尋引擎的程式設計師都知道,我們需要很多的計算機來儲存和處理海量資料。然而,計算機難免出現硬體故障而導致網路聯絡失敗或宕機。為了保證搜尋引擎的服務質量,我們需要保證每份資料都有多個備份。

簡單期間,我們假設乙個機器僅儲存乙個標號為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 如果有兩台機...