4.生成[0,n)的之間k個不重複的隨機整數。
#include
#include
#include
#include
using namespace std;
const int n = 10000000;
const int k = 10000000;
int randint( int l, int r )
int a[ n ];
int main(void)
return 0;}
5.如果1mb是嚴格控制的空間,如果資料有1.25mb的bit數目。那麼應該是需要讀取2次。
可以將輸入檔案分成兩分,第乙份儲存[0,5000000)的數,第二個檔案儲存[5000000,10000000)的數字,然後分別進行排序,所用記憶體就可以降到1mb以內。如果我們把檔案分成k份(每份都存一定區間的數),那麼就可以在nk的時間,n/k的空間內完成排序。
6.如果每個資料出現最多10次,那麼需要4個bit位來統計乙個數。可以模擬第五題,可以分成4份,在n/4的空間內完成。同樣,當儲存數字資訊的量變化時,分成更多份,就可以在更小的空間內完成。
7.如果某個數出現超過一次的話,會發生什麼?
會被忽略掉, 因為原來的程式本身就是用來處理只出現一次的情況的。
在這種情況下,如何修改程式來呼叫錯誤處理函式?
while (scanf("%d", &i) != eof)
if(test(i)) call_error_fun();
else set(i);
當輸入整數小於零或大於等於n時,又會發生什麼?
會出現訪問越界的情況。-1訪問時,會訪問a[-1]的31個bit位。
如果某個輸入不是數值又如何?在這些情況下,程式該如何處理?
輸入可能是浮點數,或是字元什麼的~~
可以先讀入字串,再用atoi轉換成為整形數,如果失敗,則進行出錯處理。
8.免費**號碼至少有800,878,888等,那麼如何檢視乙個號碼是否是免費號碼。?
第一種方案:如果是一千萬個**號碼都有可能成為免費號碼,那麼至需要1.25mb * (免費號碼字首個數)。
第二種方案:省空間,多次掃瞄檔案:
1、首先掃瞄整個檔案,看有哪個免費號碼字首。以及每個免費號碼字首下的號碼個數。
2、設定區間對映表:比如800字首有125個免費號碼,找到最大的數,與最小的數,差值做為bit長度。
第三種方案:建立索引的方式來進行處理。以最後7位為索引,後面800,878什麼的,為值。如果不是免費號碼,應該是不用加入到這個hash表中。
9.本題值得一說。
初始化空間需要大量時間,不過我們的應用只需要其中一點點空間,比如1000000的點陣圖,我們只用到其中的10位,怎樣節省時間?題目中提示,可以用額外的正比於向量大小的空間。我當時直接看的答案,到晚上搜了搜才看懂。
解決方法使用了兩個額外的向量,from和to,變數top。如果對i位置進行初始化,進行一下步驟:
from[i] = top; to[top]=i;data[i] = 0;top++;
from[i]=top的目的是將i在to中的索引放入to中,to[top]=i的意識是,這個top位置對應的是i,這時data就可以做相應的操作,然後top右移。
判斷乙個位置是否初始化過的條件是( from[i] < top && to[ from[i] ] == i ),from[i]
10.類似於取快遞,根據**號碼的最後一位或者最後兩位進行分類,類似於雜湊的思想,用順序遍歷來處理碰撞。不能用開頭的原因是很多**號碼的前面都是一樣的,比如手機號碼都是以1開頭的。而且最後一位的分布比較隨機、均勻。
11.= =答案竟然說飛鴿傳書。
12.鉛筆? t.t ....
C Primer 習題解答 第一章
自己動手做習題,加深理解。這些都是自己做的,如果有不對或不妥的地方,請指出,謝謝。習題 1.3編乙個程式,在標準輸出上列印 hello world 解答 include int main 習題1.4 我們的程式利用內建的加法操作符 來產生兩個數的和。編寫程式,使用乘法操作符 產生兩個數的積。解答 i...
程式設計珠璣 第一章習題1
1.如果記憶體不緊缺,你將如果用一種語言 該語言可以使用庫來表示和排序集合 來進行排序。a.c語言 qsort include include int intcomp int x,int y int a 1000000 int main b.c 語言 sort include include inc...
程式設計珠璣第一章
原文中的問題 如何在1mb的空間裡面對一千萬個整數進行排序?並且每個數都小於1千萬。實際上這個需要1.25mb的記憶體空間。1mb總共有838,8608。所以估計也可以在1mb左右的空間裡面進行排序了。include include define bitsperword 32 define shif...