《程式設計珠璣》第一章筆記

2021-05-28 11:45:32 字數 1024 閱讀 6315

文章從乙個實際的問題開始:乙個**系統,7位數的**號碼,用1mb的記憶體空間將這些**號碼排序。

分析:如果將這些**號碼看成int型別的整數,將其讀入記憶體中進行排序,int型別4個位元組,最多有10000000個**號碼,則需要40mb的記憶體空間,遠遠超出題目的要求,但是這10000000個資料有他們的特點:

1、  輸入資料限制在相對較小的範圍內

2、  資料沒有重複

3、  對於每條資料,除了單一整數外,沒有其他關聯資料

對於此類資料,可以用位圖或者位向量來進行排序。

下面是我自己寫的乙個c程式的片段:

#define maxn 10000000

#define byte 8

#define mask 0x7

#define move 3

char bitmap[maxn/byte+1];

void set(int n)

void test(int n)

這種方法將會用去1.25mb的記憶體空間。

擴充套件問題一:當記憶體空間嚴格限制在1mb以內,怎樣實現排序?

利用兩趟演算法:先對5000000一下的數字進行排序,然後對5000000以上(包括5000000)進行排序。

擴充套件問題二:假如每個數不是出現1次,而是出現10次,怎麼去解決?

2^4=16>10,因此使用半個位元組記錄乙個數字,總共需要5000000個位元組,需要5mb的記憶體空間,如果記憶體有1mb的嚴格限制,那麼就要使用多趟演算法,用5趟可以解決。

擴充套件問題三:現在免費區號擴大到800、877、888,以後還會擴充套件,你怎麼用1mb左右的記憶體空間,對所有免費的**號碼進行排序?如何將免費的**號碼儲存在乙個集合中,實現快速查詢。

我們可以將**號碼的前3個數看成對免費**號碼的分類。首先進行一趟掃瞄,將號碼分類於三個檔案中,然後利用位圖演算法對每個檔案進行排序。對於查詢,如果記憶體沒有嚴格的限制,可以將一類資料匯入記憶體,利用二分查詢。

總結:對於空間要求嚴格的,可以利用位圖演算法來節省空間,多趟演算法可以利用時間換取空間。

程式設計珠璣第一章

原文中的問題 如何在1mb的空間裡面對一千萬個整數進行排序?並且每個數都小於1千萬。實際上這個需要1.25mb的記憶體空間。1mb總共有838,8608。所以估計也可以在1mb左右的空間裡面進行排序了。include include define bitsperword 32 define shif...

程式設計珠璣第一章

下午看完程式設計珠璣第一章,感覺很不錯!如作者所說 閱讀本書乙個提示,不要太快,一次閱讀一章。集中精力思考,解答課後習題。寫總結就是在剛弄懂的時候,這時候是最恰當的時候,最容易接受。題目要求 乙個最多含有1000萬個整數的檔案,整數沒有重複,請輸出公升序排列。約束 最多1m記憶體,時間10s。題目很...

程式設計珠璣學習筆記 第一章

def fast generate n,k random list x i for i in range 0,n for i in range 0,k t int random n i i x i x t x t x i return random list這是乙個o k 效率的巧妙演算法,我自己的...