編程珠璣摘錄

第一部分 基礎

第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 代碼調優法則

空間換時間法則

時間換空間法則

循環法則

邏輯法則

過程法則

表達式法則

 

發佈了18 篇原創文章 · 獲贊 81 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章