程式設計珠璣ch01

2021-07-11 11:19:49 字數 1880 閱讀 2664

問題描述:

輸入:乙個檔案,至多包含n個正整數,每個正整數都要小於n,n=107

,如果輸入時某乙個整數出現了兩次,就會產生乙個致命的錯誤。這些整數與其他任何資料都不關聯。

輸出:以增序形式輸出經過排序的整數列表。

約束:至多只有1mb的可用主存;但是可用磁碟空間非常充足。執行時間至多允許幾分鐘;10秒鐘是最適宜的執行時間。

分析:

方案一:

每個數32位,在1mb空間中儲存250000個數。對輸入檔案讀40次,第一次讀0到249999的數,第二次讀250000到499999的數,依次類推。每次對讀到記憶體的數做快速排序,排序之後輸出到輸出檔案。

方案二:

每個數用1個位表示,10000000個數需要10000000bit=1250000byte=1.19mb,需要分成兩段。第一段處理0到4999999的數,第二段處理5000000到999999的數。

將位圖初始化為全0。

從輸入中讀到數n,則將點陣圖中的第n位置為1。

讀完一段,將這一段中統計到的數輸出到輸出檔案,需要從位圖的第0位到第4999999位遍歷。

1.如果不缺記憶體,如何使用乙個具有庫的語言來實現一種排序演算法以表示和排序集合?

c++有實現排序的函式:sort,該函式實現快速排序

2.使用位邏輯來實現位向量

class bitmap

void

set(int i)

4.如何生成位於0到n-1之間的k個不同的隨機順序的隨機整數

方法一:

bool *arr=(int*)malloc(sizeof(bool)*n);

int *res=(int*)malloc(sizeof(int)*k);

memset(arr, 0, n*sizeof(int));

for(int i=0; iint j=-1;

while(arr[j=rand()%n]);

res[i]=j;

arr[j]=true;

}

方法二:

int

*arr=(int

*)malloc(sizeof(int)*n);

int*res=(int

*)malloc(sizeof(int)*k);

for(int i=0; ifor(int i=0; iint to=rand()%n;

swap(arr[i], arr[to]);

}memcpy(res, arr, sizeof(int)*k);

6.每個整數至多只能出現10次,而不是每個整數至多只能出現1次。

對每個整數,用4個位來表示其在輸入檔案中的出現次數。

7.使用更多的空間來換取更少的執行時間存在乙個問題:初始化空間本身需要消耗大量的時間。說明如何設計一種技術,在第一次訪問向量的項時將其初始化為0。你的方案應該使用常量時間進行初始化和向量訪問,使用的額外空間應正比於向量大小。因為該方法通過進一步增加空間減少初始化的時間,所以僅在空間很廉價、時間很寶貴且向量很稀疏的情況下考慮。

解決的方法是使用兩個外的向量:from和to,還有乙個變數top。to是乙個棧,top為棧頂,to中儲存輸入資料的記錄,每當輸入乙個資料,將該資料壓入棧中,並將它在棧中的位置存入from中。

if(!(from[i]0;

top++;

...}

10.在成本低廉的隔日送達時代之前,商店允許顧客通過**訂購商品,並在幾天後上門自取。商店資料庫使用客戶的**號碼作為其檢索的主關鍵字(客戶知道他們的**號碼,並且這些關鍵字幾乎都是唯一的)。你如何組織商店的資料庫,以允許高效的插入和檢索操作?

根據**號碼的最後兩位作為客戶的雜湊索引,進行分類。

課下測試ch01修改補交

由於當時學習態度有問題,沒有注意到第一次的課下測試,雖然在當周的總結中就進行補交,但是當時態度並沒有很認真,可能沒有引起老師的注意,現在重新修改,望老師諒解。單選題 1 分 amdahl定律說明,我們對系統的某個部分做出重大改進,可以顯著獲得乙個系統的加速比。a 正確 b 錯誤 正確答案 b 你的答...

程式設計珠璣ch02

1.給定乙個包含32位整數的順序檔案,它至多只能包含40億個這樣的整數,並且整數的次序是隨機的。請查詢乙個此檔案中不存在的32位整數。在有足夠主存的情況下,你會如何解決這個問題?如果你可以使用若干外部臨時檔案但可用主存卻只有上百位元組,你會如何解決這個問題呢?情形一 32位整數,從0到23 2 1 ...

程式設計珠璣閱讀筆記01

在此案例分析中我們可以發現,這些事實所包含的第 乙個教訓是 仔細分析小問題 有時可以帶來巨大的實際好處。在本例中,花幾分鐘的時間來仔細分析,導致了 長 度 程式設計時間和執行時間減少了乙個數量級。chunk yeager將軍 第 乙個 飛行速度超過 音速的人 使用 簡單 較少的零部件 易於維護 非常...