《程式設計珠璣》讀書筆記(三)

2021-06-15 11:22:37 字數 2772 閱讀 8260

《程式設計珠璣》的第二部分講的是效能,第三部分講的是應用,所以我暫時跳過第二部分,直接看應用。

第十一章 排序

排序問題一直是面試的熱點!本章首先介紹了插入排序,然後介紹了快速排序,並提出了快速排序的幾種改進方法,例如雙向劃分、隨機數劃分、以及小範圍結合插入排序,三種的效能遞增。

排序免不了交換,書中特別指出將swap()函式寫入迴圈中會加速。

插入排序: 穩定,時間複雜度o(n^2),主要**如下

[cpp]view plain

copy

for( i = 1 ; i < n ; i ++ )    

快速排序: 不穩定;時間複雜度o(nlogn)。

當出現n個相同元素組成的陣列時,插入排序效能非常好,總執行時間為o(n),但qsort效能非常糟糕,因此提出改進。

改進二:採用雙向劃分的方法,代入如下:

[cpp]view plain

copy

void

qsort3( l , u )  

ifl>=u  

return

t = x[l];  i = l;  j = u + l;  

loop  

doi++  

while

i<=u && x[i]//從左往右找到第乙個大於等於t的數

doj--  

while

x[j]>t           

//從右往左找到第一風格小於等於t的數

ifi > j  

break

;  swap( i , j )  

swap( l , j)  

qsort3( l , j-1 )  

qsort3( j+1 , u )  

改進三:隨機元素劃分

改進四:快排+插入排序

第十二章 取樣問題

本章主要介紹了生成0~n-1區間內m個隨機數的三種方法,假設bigrand()函式返回乙個隨機大整數,例如c庫函式rand()返回15位整數。

方法一:bigrand()%remaining

方法二:c++zhongstl的set集合,隨機生成乙個數,插入set中,最後有序輸出。用空間換取時間,o(mlogn)

方法三:隨機打亂乙個陣列,輸出前m個即可,o(n+mlogn)

第十三章 搜尋

本章介紹了5中表示隨機整數集合的資料結構:有序陣列、有序鍊錶、二叉樹、箱、位向量。各自效能如下:

集合表示

初始化操作

insert操作

輸出操作

總時間空 間

有序陣列1m

mo(m^2)

m有序鍊錶1m

mo(m^2)

2m二叉樹

1logm

mo(mlogm)3m箱

m1mo(m)

3m位向量n1

no(n)

n/b

有序陣列 intsetarr類 實現於 p129;

有序鍊錶 intsetlist類 實現於 p130;

二叉樹    intsetbst類 實現於 p132;

位向量   intsetbitvec類 實現於 p134;

箱         intsetbins類   實現於  p135;

詳細**見《附錄e》

本章的邊欄介紹了「拼寫檢查器」的實現。

第十四章 堆

本章首先介紹了堆的性質:一是有序,二是形狀,以及用陣列來表示堆。

堆的兩個關鍵函式是:siftup()自底向上,siftdown()自頂向下,**分別實現於p144、p145。

優先順序佇列(插入和刪除操作很頻繁)是一種常見的資料結構,主要有三種實現方法:有序序列、無序序列、堆(介於前兩者之間的折中方法),三者效能比較如下:

資料結構

一次insert時間

一次extract時間

兩種操作各n次時間

有序序列

o(n)

o(1)

o(n^2)

堆o(logn)

o(logn)

o(nlogn)

無序序列

o(1)

o(n)

o(n^2)

用堆實現優先順序佇列的**在p147,建議動手實踐!

最後介紹了堆排序演算法,分兩步進行:建堆+排序,o(nlogn),習題2,3對堆排序進行了改進,暫未明白。

堆排序**:

[cpp]view plain

copy

fori = [2 , n)  

siftup(i)  

for( i = n ; i >= 2 ; i-- )  

swap( l , i )  

siftdown(i-1);  

//x[l]是前i個元素中最大的,將它和x[i]交換使得有序序列多乙個元素,因此下移保持堆平衡

第十五章 字串

本章主要介紹了三種字串的應用:

1、生成詞典,統計單詞的個數,分別用c++和c實現。

c++實現使用了stl的set和map,其實本質是平衡搜尋樹。

c實現使用的是雜湊表,比c++速度更快。

2、最長重複字串,用字尾陣列實現,o(nlogn),需要額外的n個指標空間。

3、生成隨機文字,主要了解k階文字-->k接馬爾科夫鏈。

《程式設計珠璣》 讀書筆記

程式設計珠璣 讀書筆記 婁雨禛pb16060356 準確的問題描述 很多時候,我們總是過度關注了解決問題所用的巧妙演算法,而將問題本身的重要性忽視。當我們拿到乙個問題時,應當反覆研讀問題的每乙個細節,因為正是這些細節的細微偏差導致了我們在解決問題時方案與技巧的重大不同。如果我們只花很少的時間研讀問題...

珠璣程式設計讀書筆記 《一》

我看這本書是這樣的,你呢?也是偶然發現這本書的,好多書都沒能堅持看完,希望這次能堅持下去。第一章 問題描述 對磁碟檔案中的10000000個 號碼 7位數字 進行排序。約束 1mb的主存,磁碟空間充足,時間最多幾分鐘,10秒為最佳。我想,如果在面試的時候給我這個問題,我肯定不能給出乙個讓面試官滿意的...

抽樣問題 《程式設計珠璣》讀書筆記

問題 輸入兩個整數m和n,並且m 方法一 knuth著作 seminumerical algorithms 中提出的方法,順序遍歷n個數,通過隨機測試條件的元素被選擇。以乙個例子來解釋所說的隨機測試條件,比如m 2,n 5。第乙個元素0被選擇的概率是2 5 第二個元素1被選擇的概率取決於第乙個元素有...