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位整數 在檔案中至少缺失乙個這樣的數 為什麼?在具有足夠記憶體的情況下,如何解決該問題?如果有幾個外部臨時檔案可用,但是僅有幾百位元組的記憶體,又該如何解決該問題?記憶體足夠的情況下,可以採用位圖法。即設一...