我看這本書是這樣的,你呢?
也是偶然發現這本書的,好多書都沒能堅持看完,希望這次能堅持下去。
第一章
問題描述:
對磁碟檔案中的10000000個**號碼(7位數字)進行排序。
約束:1mb的主存,磁碟空間充足,時間最多幾分鐘,10秒為最佳。
我想,如果在面試的時候給我這個問題,我肯定不能給出乙個讓面試官滿意的答案
書中提供了一些方案:
一、修改使用現有的基於磁碟的合併排序。(說實話,我沒有了解過此類演算法,還得花些額外的時間去學習)
二、使用多通道演算法,將號碼表示成32位整數,1mb空間了可以儲存250000個號碼,那麼10000000個號碼則要40個通道來讀取檔案,第乙個通道將0到249999之間任意數讀如記憶體,並對其排序,以此類推,第四十個通道將處理9750000到9999999之間的數。使用快排。作者說:整個程式**只20多行,比第乙個方案直接少了個『0』。不用使用中間磁碟檔案。不好的一點:讀入檔案40次。
三、利用位圖,在這之前,關於位圖,我只是了解到可以用來處理資料量比較大的排序,而對其原理、實現都一點都不知道。
文中舉了乙個例子,讓我對位圖有了基本的認識,感覺位圖確實很強大。可以節省很大的空間。
eg:利用20位的字串來表示乙個小型的非負整數集合,如{1,2,3,5,8,13},我們可以這樣儲存:
01110100100001000000
那麼在這個問題中,每個號碼表示乙個小於千萬的整數,我們則可以使用乙個具有千萬位的字串來表示該檔案。在該字串中,當且僅當整數i出現在檔案中時,第i個位設為1.
演算法如下: 直接摘自書本
1。初始化:
for i = [0,n)
bit[i] = 0
2.處理檔案:
for each i in input file
bit[i] = 1
3.這時排序已經完成,直接輸出就好
for i = [0,n)
if i = 1
write i on the output file
我相信這個演算法所有人都可以很容易的理解。
簡潔、明了,易讀,效率高,真是個強大的演算法
對於本章節,核心思想就這樣了。
我想自己用**實現這個算,執行體驗一下他的效率,但是發現第二步的處理對我來說是個問題。
所以乙個遺留的問題,作者說在接下來的章節會進行描述,這正好是乙個很好的**,**我繼續往下讀
好了,第一章就到這,演算法已經記下,就等著實現了。
《程式設計珠璣》 讀書筆記
程式設計珠璣 讀書筆記 婁雨禛pb16060356 準確的問題描述 很多時候,我們總是過度關注了解決問題所用的巧妙演算法,而將問題本身的重要性忽視。當我們拿到乙個問題時,應當反覆研讀問題的每乙個細節,因為正是這些細節的細微偏差導致了我們在解決問題時方案與技巧的重大不同。如果我們只花很少的時間研讀問題...
《程式設計珠璣》讀書筆記(三)
程式設計珠璣 的第二部分講的是效能,第三部分講的是應用,所以我暫時跳過第二部分,直接看應用。第十一章 排序 排序問題一直是面試的熱點!本章首先介紹了插入排序,然後介紹了快速排序,並提出了快速排序的幾種改進方法,例如雙向劃分 隨機數劃分 以及小範圍結合插入排序,三種的效能遞增。排序免不了交換,書中特別...
抽樣問題 《程式設計珠璣》讀書筆記
問題 輸入兩個整數m和n,並且m 方法一 knuth著作 seminumerical algorithms 中提出的方法,順序遍歷n個數,通過隨機測試條件的元素被選擇。以乙個例子來解釋所說的隨機測試條件,比如m 2,n 5。第乙個元素0被選擇的概率是2 5 第二個元素1被選擇的概率取決於第乙個元素有...