《程式設計珠璣》
讀書筆記
婁雨禛pb16060356
準確的問題描述
很多時候,我們總是過度關注了解決問題所用的巧妙演算法,而將問題本身的重要性忽視。當我們拿到乙個問題時,應當反覆研讀問題的每乙個細節,因為正是這些細節的細微偏差導致了我們在解決問題時方案與技巧的重大不同。
如果我們只花很少的時間研讀問題本身,而過度專注於問題的解決時,極有可能在百般忙碌之後,發現自己走了一大段彎路。所謂「捨本逐末」,或許說的就是這個道理吧。
資料決定程式結構
程式語言是給人閱讀的,程式的執行效率是由資料流的高效與否體現的。而橫跨這兩者之間的,便是程式結構。事實上,良好的程式結構能夠非常好地同時達成上述兩個目標,而基本的方法,就是讓我們尊崇這麼乙個原則:資料決定程式結構。
這裡有一些值得記錄的注意點。
出錯資訊
混亂系統的數百個出錯資訊散布在出錯**中。同時,這些出錯資訊又和其他語句混雜在一起。而清晰系統則通過乙個專用函式來訪問這些出錯資訊。
單詞分析
很多計算機問題都是由英文單詞的分析引起的。拼寫檢查器會使用「字尾去除」來精簡詞典,這是所有程式設計人員應當注意的。
結構化資料
最初,結構化資料就意味著選擇恰當的變數名。後來,在程式設計師使用「平行陣列」或暫存器偏移量的地方,程式語言加入了記錄或結構以及指向它們的指標。指標的引入極大地優化了資料的傳遞和表達。我們在程式設計過程中也要盡量發揮指標操作的優越性。
**調優法則
**調優大致有以下六條法則。
空間換時間法則
空間換時間在很多地方都見得到。比如,求斐波那契數列時,我們為了防止遞迴所產生的龐大計算量拖慢執行速度,往往將之前步驟的資料儲存起來,以便後次呼叫。空間換時間的思想在今天尤為適用。隨著儲存空間的大幅增加,我們更追求速度的提公升。
時間換空間法則
密集儲存表可以通過增加儲存和檢索資料所需的時間來減小儲存開銷。
迴圈法則
將**移出迴圈與其在迴圈的每一次迭代中都執行一次某種運算,不如將其移到迴圈體外,只計算一次。
迴圈展開通過將迴圈展開,可以減少修改迴圈下標的開銷,從而有效避免管道延遲,增加指令的並行性。
刪除賦值如果內迴圈中很多開銷來自普通的賦值,通常可以通過重複**並修改變數的使用來刪除這些賦值。
消除無條件分支
迴圈合併
邏輯法則
利用等價的代數表示式。如果邏輯表示式的求值開銷太大,就將其替換為開銷較小的等價代數表示式。
過程法則
打破函式層次。對於呼叫自身的函式,通常可以將其改寫為內聯版本並固定傳入的變數來縮短其執行時間。
表示式法則
消除公共子表示式。如果兩次對同乙個表示式求值時,其所有變數都沒有任何改動,那麼,就應當儲存第一次的變數值以取代第二次的求值。
珠璣程式設計讀書筆記 《一》
我看這本書是這樣的,你呢?也是偶然發現這本書的,好多書都沒能堅持看完,希望這次能堅持下去。第一章 問題描述 對磁碟檔案中的10000000個 號碼 7位數字 進行排序。約束 1mb的主存,磁碟空間充足,時間最多幾分鐘,10秒為最佳。我想,如果在面試的時候給我這個問題,我肯定不能給出乙個讓面試官滿意的...
《程式設計珠璣》讀書筆記(三)
程式設計珠璣 的第二部分講的是效能,第三部分講的是應用,所以我暫時跳過第二部分,直接看應用。第十一章 排序 排序問題一直是面試的熱點!本章首先介紹了插入排序,然後介紹了快速排序,並提出了快速排序的幾種改進方法,例如雙向劃分 隨機數劃分 以及小範圍結合插入排序,三種的效能遞增。排序免不了交換,書中特別...
抽樣問題 《程式設計珠璣》讀書筆記
問題 輸入兩個整數m和n,並且m 方法一 knuth著作 seminumerical algorithms 中提出的方法,順序遍歷n個數,通過隨機測試條件的元素被選擇。以乙個例子來解釋所說的隨機測試條件,比如m 2,n 5。第乙個元素0被選擇的概率是2 5 第二個元素1被選擇的概率取決於第乙個元素有...