程式設計珠璣(第二版)讀書筆記 1 2

2021-08-25 20:22:30 字數 1067 閱讀 6215

問題:乙個檔案f,包含最多1000萬條無序的、不重複的記錄,每條記錄都是乙個7位的十進位制正整數,利用1mb左右的記憶體空間,按照整數的大小對檔案進行公升序排序,將結果儲存到檔案fo中。

分析:1mb記憶體,共有1024*1024*8=8388608bit,如果每個正整數採用32位二進位制儲存,可以存放1024*1024*8/32=262144條記錄。乙個7位十進位制正整數在[1,10000000)之間。

解決方案1:

使用基於臨時檔案的歸併排序,大致的方法如下:

第一次從f中讀取前250000條記錄,在記憶體中用快速排序進行排序,輸出到乙個臨時檔案tmpf0中,之後以此類推,每次從f中讀取250000條記錄,排序後存入臨時檔案tmpfi中。

最後,將臨時檔案tmpf0-tmpf39,這40個臨時檔案進行歸併,存入fo。

解決方案2:

40趟讀取f,方法大致如下:

分40趟,第一趟從f中找出數值在0-249999之間的記錄,放入記憶體,用快速排序進行排序,然後儲存到輸出檔案fo中。這樣就省去了臨時檔案,但需要從頭到尾將輸入檔案f讀取40次。

解決方案3:

位圖法,方法大致如下:

由於記錄的數值不超過1000萬,可以用1000萬個bit來標記乙個整數是否存在,這樣需要1.192mb的記憶體空間就可以標記所有的7位正整數。先將這1000萬個bit全部置零,然後對f掃瞄,如果乙個數值存在,則將對應的位置1,最後將對應位為1的數值按照公升序寫入檔案fo。

第二章中解決了三個小問題;

a、找出順序檔案中缺失的記錄。用的是二分查詢的方法。

b、在正比於n的時間內將乙個n元一維向量迴圈左移i個位置(i < n)。

此問題解決方法是將向量中0到i-1號元素翻轉,再將i到n-1號元素翻轉,最後將整個向量翻轉,即:

reverse(0, i-1);

reverse(i, n-1);

reverse(0, n-1);

c、找出英語詞典中所有變位詞的集合。變位詞就是例如pots、stop、tops這樣的單詞。

此問題解決方法是給詞典中的每乙個單詞做標識,比如將每個單詞中的字母按字典序排列後作為該單詞的標識,然後所有單詞按照標識排序,最後去掉重複的標識。

第六周讀書筆記 《程式設計珠璣(第二版)》

本週我讀的書是美國jon bentley編寫的 程式設計珠璣 第二版 說實話,這本書裡面所提出的問題,大都需要我去細細思考,仔細揣摩,有時候作者輕描淡寫的幾句話,我也要思考一段時間來體會其中的演算法思想,一星期讀完只能說是囫圇吞棗吧,而且再加上有軟工結對程式設計的壓力,所以以後還是要細細研讀的。這本...

程式設計珠璣(第二版)閱讀筆記03

第4章 編寫正確的程式 的開發是自上而下進行的 從一般思想開始,將其完善為獨立的 行 正確性分析則是自下而上進行的 從每個獨立的 行開始,檢查它們是如何協同運作並解決問題的 初始化 保持 終止 過去開發 時總是亂七八糟,在以後程式設計中和除錯過程中,需要同時修正錯誤 和錯誤的斷言 總是保持對 的正確...

《學習bash》第二版讀書筆記

bash定製使用者環境的所提供的四個最重要的特性 特殊檔案 bashrc,bash profile 最重要的 bash logout,etc profile 前面三個檔案不存在時使用 別名,選項和變數。bash profile在shell登入時呼叫 在gnome桌面環境中,只有在使用相應的使用者登入...