程式設計珠璣第二章

2022-03-29 21:43:07 字數 2308 閱讀 2005

a題給定乙個最多包含40億個隨機排列的32位整數的順序檔案,找出乙個不在檔案中一32位整數。

1、在檔案中至少存在這樣乙個數?

2、如果有足夠的記憶體,如何處理?

3、如果記憶體不足,僅可以用檔案來進行處理,如何處理?

答案:1、32位整數,包括-2146473648~~2146473647,約42億個整數,而檔案中只有40億個,必然有整數少了。

2、如果採用位數思想來存放,則32位整數最多需要占用43億個位。約512mb的記憶體空間。

可以採用前一章的位處理方法。然後判斷每個int是否等於-1。因為-1的二進位制表示是全1的。如果不等於-1。那麼說明某一位沒有置位。需要進行處理。

3、記憶體不足,可以採用如下思想:

1、按最高位分為兩段,沒有出現的那個數,肯定在比較小的段裡面。

如果比較少的段最高位為1,那麼缺少的那個數的最高位也為1.

如果比較少的段最高位為0,那麼少的那個數的最高位也是0.

依次按以上方法去處理每個位。

演算法複雜度為o(n)。每次處理的部分都是上一次的一半。累加之後是o(n).

思想與找第k小數的思想是一樣的。只不過在這裡是有乙個自動分割的過程。而找第k小數的時候,是隨機找乙個數。

為了驗證思想這裡寫了段c**。

[cpp]view plain

copy

int get_lost(int *a, int *b, int *c, int alen, int bit)  

if (biter <= citer)  

else  

}  return re;  

}  a, b, c,都是三個等長的陣列,alen表示其長度。bit表示位數。比如32位。bit=32.

re表示最後缺少的那個數。

b題字串迴圈移位

比如abcdef 左移三位,則變成defabc

基本還是按照書上的演算法,

_rev(0, i)

_rev(i, len)

_rev(0, len)

[cpp]view plain

copy

static void _res(char *a, int n)  

}  char *rever(char *a, int n, int len)  

c 題給定乙個單詞集合,找出可以相互轉換的集合。

比如abc bca cba都可以相互轉換。

演算法如下

把由於每個單詞可以進行唯一性標識,把這個單詞按照字母進行排序,可以相互轉換的單詞都有同樣的標識。

這裡用c++來寫了。 

[cpp]view plain

copy

void gen_label(vector&dict, map>&rec)  

for (map>::iterator iter = rec.begin();  

iter != rec.end(); ++iter)  

}  2.6習題

1 、如果沒有時間進行預處理,那麼可以找到這個單詞的識別符號,然後掃瞄這個字典,識別符號相同的輸出。

如果可以預處理,那麼可以先預處理,用gen_label函式進行預處理則可。

2、把原來的程式取較大的部分則可。實際上如果要形成嚴格地每次下降一半,那麼需要如下處理。

如果最多有max個整數,比如對於有4個bit位的整形數。最多有16個數。

如果給了32個數,實際上只需要取前面17個數就可以了,後面的不要了。

把這17個數按首位分為兩堆,按理說一邊是8,一邊是9。如果發現分的一邊比9還要多出幾個。多出來的也不用看了。

接下來處理9個的情況。

通過這種策略,可以保證最終可以找到那個重複的數。

3、略過。這裡涉及了乙個效率不是那麼高效的演算法,不看也罷。

4、略過

5、如果是自己寫函式那麼就是前面所寫的_rev函式。

如果是要呼叫rever()函式。那麼方法如下。

[cpp]view plain

copy

int main(void)  

printf("%s\n", a);  

}  return 0;  

}  6、把名字對應的按鍵形成乙個唯一的識別符號,可以先對名字進行預處理。

用hash,

hash_map> rec;

7、 略過,記住按列再按行排序則可。

8、把最小的k個數找到o(nlogk),然後看這個k個數的和是否小於t.

9、搜尋次數c > nlgn/ (n - lgn)

10、放到水中。

**:

程式設計珠璣第二章總結

分析 如果記憶體足夠的話,可以採取第一章的點陣圖排序法,以o n 的效率就可以解決。如果記憶體不足的話,但是有幾個外部檔案可以儲存資料,那麼就可以採用二分查詢的思想來解決問題 這裡的思路比較巧妙,它不是通常意義上的二分查詢,但是思維模式很相似.我們可以通過掃瞄輸入檔案,將第一位是0的寫入乙個檔案,將...

程式設計珠璣第二章ABC

問題 找出乙個不在檔案中的32位整數。注意 題目中沒有說,這40億個數是否是含有重複的資料 條件限制 1 如果有足夠的記憶體,如何處理?2 如果記憶體僅有上百位元組 記憶體不足 且 可以用若干外部臨時檔案,如何處理?舉例 比如abcdef 左移三位,則變成defabc 條件限制 空間限制 可用記憶體...

《程式設計珠璣》第二章 「啊哈!演算法」

三個問題 1.給定乙個最多包含40億個隨機排列的32位整數的順序檔案,找出乙個不在檔案中的32位整數 在檔案中至少缺失乙個這樣的數 為什麼?在具有足夠記憶體的情況下,如何解決該問題?如果有幾個外部臨時檔案可用,但是僅有幾百位元組的記憶體,又該如何解決該問題?記憶體足夠的情況下,可以採用位圖法。即設一...