《程式設計珠璣》是一本很好的,經典的程式設計書。這兩天開始讀,有種「相見恨晚「的感覺。書中通過講述作者自己的親身體會來說明程式設計的藝術。很有感染力。
第一章講述了乙個**號碼排序的故事。強調化蘩為簡的重要性。很多問題,咋一看挺難的,如果仔細分析轉化,可能會發現其實很簡單。
第二章二分搜尋和排序在實際問題處理中的強大,高效的應用。
感覺二分就是分治思想的一種具體實現。分治思想,把問題一次縮小一些,最終求得解。速度很快。排序本身的應用很簡單,重要的應用則是用排序對很多實際問題的預處理過程,有了排序,後面的處理很可能會更高效。
第三章資料決定程式結構。
電腦程式的作用,從本質上來說,都是處理資料,更高效地處理資料。程式設計中出現的問題,很多都是一開始對資料的分析不到位,資料表示的結構設計不好造成的。
程式設計師在節省空間方面無計可施時,醬紫記從**中解脫出來,退回起點並幾種心力研究資料,常常能有奇效。資料的表示形式是程式設計的根本。
下面是退回起點進行思考時的幾條原則:
使用陣列重新編寫重複**。冗長的相似**常常可以使用簡單的資料結構
--陣列來更好地表達。
封裝複雜結構。當需要非常複雜的資料結構時,使用抽象術語進行定義,並將操作表示為類。
盡可能使用高階工具。超文字,名字
--值對,電子**,資料庫,程式語言等都是特定問題領域中的強大的工具。
從資料得出程式的結構。在編寫**之前,優秀的程式設計師會徹底理解輸入,輸出和中間資料結構,並圍繞這些結構建立程式。
第四章編寫正確的程式
令人震驚的是:世界上第一篇二分搜尋**在
1946
年就發表了,但是第乙個沒有錯誤的程式卻直到
1962
年才出現。
認真編寫程式,並驗證。
第五章程式設計小事
編碼。對於比較難寫的函式,最容易的方法是使用方便的高階偽**來構建程式框架,然後將偽**翻譯成要實現的語言。
測試。在腳手架中對元件進行測試要比在打系統中更容易,更徹底地。
除錯。對隔離在其腳手架中的程式進行除錯是很困難的,但是若將其嵌入到真是的執行環境中,除錯工作會更困難。
計時。對於執行時間非常重要的程式,應進行實驗以確保程式恩個夠達到我們預期的效能。
第六章程式效能分析
如果僅需要較小的加速,就對效果更佳的層面做改進。
如果需要較大的加速,就對多個層面做改進。
第七章粗略估算
曾經在網上看到
的面試題,問面試者乙個巴士能裝多少個棒球。當時以為這個東西很扯淡,後來以為這種題目是用來考智商的,今兒讀了《程式設計珠璣》的第七章才意識到這個問題實際上是在考粗略估算,而粗略估算是在是太重要了!粗略估算的運用,可以說是乙個人思維方式層面的提上。
當拿到乙個問題時,特別是跟數字有密切關係的問題時。在已知常識的基礎上,粗略估算一下問題的規模,往往能得到比較準確的感性認識,從而作出正確的判斷。 72
法則:假設以年利率
r%投資一筆錢
y年,如果
r*y=72.
那麼你的投資差不多會翻倍。
little
定律:對於任意的系統,系統中的物體的平均數量等於物體離開系統的平均速率和每個物體在系統中停留的平均時間的乘積。
安全係數:當你不確定自己的系統在實際應用中的效能時,以
2倍或者
4倍或者
6倍的係數降低對系統效能的評估。
第八章演算法設計技術
拿到乙個問題之後,首先應想到一種可以實現的簡單演算法。然後進一步分析如何能使運算更具效率,空間更優。使用分治演算法和動態規劃(本質上就是記錄以前生成的,以後還能用的資料。)等高階演算法來加速。
幾個重要的演算法設計技術: 1
,儲存狀態,避免重複計算。 2
,將資訊預處理至資料結構中。 3
,分治演算法。 4
,掃瞄演算法。 5
,累積。注意從以前的資料中找出與現在計算的資料的關係,減少計算量。 6
,下界。如果數學能力比較強,最好分析一下處理乙個問題的時間空間最低下界。有助於評估自己的程式到底還能不能改進。
讀《程式設計珠璣》 (一)
第一章 開篇 程式設計中需求的明確化非常重要,開篇兩人的對話對此進行了說明 a 我該如何對磁碟檔案進行排序?b 需要排序的內容是什麼?檔案中有多少條記錄?每個記錄的格式是什麼?a 該檔案包含至多10,000,000個記錄,每條記錄都是乙個7位整數。b 如果檔案那麼小,為什麼要使用磁碟排序呢?為什麼不...
《程式設計珠璣》看書筆記
臨睡前翻看了下 程式設計珠璣 續 這本書,看到第一章就被吸引了,效能監視工具這節從計算素數入手。題目是 列印所有小於1000的素數 簡單直白的方法就是,針對每個小於1000的數字n,從2開始到n 1,如果能被任意乙個數整除,那它就不是素數。如下 int prime int n return 1 in...
程式設計珠璣筆記1
乙個檔案裡有1千萬 10000000 個7位的整數 小於1千萬 給大約1m記憶體讓排序 向量旋轉 abcdefgh 長度n為8 向左旋轉i 3次 某檔案包含40億個隨機次序32位整數,其中有乙個整數未出現,找出來。限制 記憶體幾百位元組,若干順序檔案。乙個詞典有230000個單詞,file和life...