第一部分 基礎
第1章 開篇
結構簡單、部件很少、易於維護、非常堅固。
正確的問題,位圖數據結構,多趟算法,時間-空間折中與雙贏,簡單的設計,程序設計的階段。
第2章啊哈,算法
看起來很困難的問題也可以有一個簡單的、意想不到的答案
第3章 數據決定程序結構
恰當的數據視圖實際上決定了程序的結構
爲什麼程序員非要編寫大程序呢?一個原因是他們缺少在2.5節中提到的重要的惰性。他們急於完成其最初的想法。在前面描述的兩個問題中,有更深層次的原因:程序員在考慮問題時受到了語言的限制。
概念壁壘
能用小程序實現的,就不要編寫大程序
程序員在節省空間方面無計可施時,將自己從代碼中解脫出來,退回起點並集中心力研究數據,常常能有奇效。(數據的)表示形式是程序設計的根本。
第4章 編寫正確的程序
二分搜索的挑戰
提供充足的時間,竟然約有10%的專業程序員能夠將這個小程序編寫正確。
第5章 編程小事
程序員都是樂觀主義者,他們總是試圖走捷徑:編寫函數代碼,並將其插入到系統中,然後熱切地期望它能運行。
5行語句的C語言腳手架就可以完成該工作。
斷言的藝術
在測試是使用斷言,而在產品發佈時將斷言關閉的程序員,就像是在岸上操練時穿着救生衣,而下海時將救生衣脫下的水手。
最好的腳手架通常是最容易構建的腳手架。
無論系統的行爲乍看起來多麼神祕莫測,其背後總有合乎邏輯的解釋。
IBM站着可以登錄系統而坐着不能登錄系統的軼事。有兩個鍵的鍵帽被換了位置
第二部分 性能
一個簡單而又功能強大的程序,令用戶欣喜又不令開發者煩惱,這正是程序員的終極目標。
第6章 程序性能分析
算法和數據結構
算法調優
數據結構重組
代碼調優
硬件
上面描述的所有改進累積起來就得到了總的加速係數400.
良好的問題定義可以避免用戶對問題需求的過高估計。
計算機系統中最廉價、最快速且最可靠的無件是根本不存在的。
簡單設計的重要性怎麼強調都不過分。
第7章 粗略估算
粗略估算在工程院校中是標準課程,對多數從業工程師來說則是謀生的必備技能。
兩個答案比一個答案好
快速檢驗
經驗法則
實踐
安全係數
Little定律隊列中物體的平均數量爲進入速率與平均停留時間的乘積
在進行粗略估算的時候,要切記愛因斯坦的名言:任何事都應儘量簡單,但不宜過於簡單。
第8章 算法設計技術
複雜深奧的算法有時可以極大地提高程序性能。
要解決規模爲n的問題,可遞歸地解決兩個規模近似爲n/2的子問題,然後對它們的答案進行合併以得到整個問題的答案。
合適的算法設計可以極大地減少運行時間。
第9章 代碼調優
由於太在乎細小的“優化”,他們編寫出的程序過於精妙,難以維護。
代碼調優的最重要的原理就是儘量少用它——效率的角色,度量工具,設計層面,雙刃劍
第10章 節省空間
簡單性可以衍生出功能性、健壯性以及速度和空間。
簡單性還可以減少代碼長度。
在真實系統中,快速的查找時間非常關鍵,一方面是爲了滿足用戶交互的需求,另一方面是因爲其他函數需要通過同一個界面來查找點。
不存儲,重新計算。稀疏數據結構。數據壓縮。分配策略。垃圾回收。
第三部分 應用
第11章 排序
使用庫排序函數
快速排序接近最優算法
第12章 取樣問題
小的計算機程序往往能夠寓教於樂。
打破概念壁壘
正確理解所遇到的問題,提煉出抽象問題,考慮儘可能多的解法,實現一種解決方案,回顧。
第13章 搜索
庫的作用。空間的重要性。代碼調優方法。
第14章 堆
用堆來解決 排序 優先級隊列
每個數據結構都可以從兩方面來看,從外部來看,它的規範說明了它做什麼——隊列通過通過insert和extract操作來維護元素序列。從內部來看,它的實現說明了它如何做。
優先級隊列的堆實現了兩種順序結構之間折中方案。
原理:正確性、抽象性、過程抽象、高效性、抽象數據類型。
第15章 字符串
如何生成隨機文本?一種比較經典的方法是讓一隻可憐的猴子在舊打字機上敲擊。
附錄D 代碼調優法則
空間換時間法則
時間換空間法則
循環法則
邏輯法則
過程法則
表達式法則