讀書筆記--編程珠璣II

學化學的應該都知道chemdraw,這是一款專門繪製化學結構的軟件,什麼苯環、雙鍵各類word難以搞定的分子式,你能夠輕鬆的用chemdraw完成,能夠稱得上化學工做者居家旅行必備的良藥。其實早在1987年的時候,貝爾實驗室的大牛Brian Kernighan(就是K&R教你寫C語言中的K)和人一塊兒設計了Chem語言,到如今還能用,彷佛在書籍排版上比chemdraw的效果更好。說了這麼多,咱不是給Chem作廣告,而是爲了引出它的另外一位創做人Jon Bebtley,也是本文即將談到的《編程珠璣II》——很是受程序員歡迎的系列書籍的做者。前端

《編程珠璣II》是一部短文集,涵蓋了程序員操縱程序的技術、程序員取捨的技巧、輸入和輸出設計以及算法示例。程序員

開頭提到的Chem語言是Pic語言的預處理器,經過做者在書中第9章討論的Pic語言一例,咱們可以明白按照語言的特性對程序進行檢查,能夠幫咱們更好地理解所使用的語言工具,並能教會咱們爲之後的程序設計更優雅的界面。算法

編程語言設計原則

  • 設計目標:設計語言以前,要認真研究你試圖解決的問題。
  • 簡單性:讓你的語言儘量地簡單。規模小的語言便於實現者設計、建立、寫文檔和維護、也便於使用者學習和使用。
  • 基本的抽象:常見的程序設計語言是基於馮・諾伊曼計算機的視角進行建立的,其指令只對小塊的數據進行操做。基本對象就是程序的抽象數據類型,而操做就是關鍵的字程序。
  • 語言的結構:表達式的天然性和實現的方便性須要作出權衡,縮進和註釋都是必需的。
  • 正交性:問題中不相關的特性在語言中也不相關;
  • 設計語言的準繩:
    • 通常性:一種操做用於多種目的;
    • 簡約性:去掉不須要的操做;
    • 徹底性:所設計的語言能描述全部感興趣的對象嗎? 
    • 類似性:讓語言儘量有啓發性;
    • 可擴展性:肯定語言能夠進一步發展;
    • 開放性:容許用戶「溜走」以使用其它工具;
  • 設計過程:在實現語言以前,經過描述語言中大量的對象來測試你的設計,當語言完成並付諸實用後,還要反覆進行新的設計已根據客戶的須要加入新特性。
  • 對編譯器生成的深入看法:儘量地從後端的處理過程當中將前端的語言分析分離出來,這樣處理器的建立更容易,也更容易兼容到系統或新的語言用途中。

文檔設計和編程有諸多類似之處,書中第10章經過幾副不斷完善的表格、插圖,穿插着介紹了文檔設計的原則。編程

文檔設計

文檔生成和編程有不少共同之處,二者都要「創造對他人有用的東西」和「必須出色的完成論文」,二者最大的共同點是都能讓人盡享「創造的樂趣」。後端

文檔設計須要創意。若是全部人着裝相同,全部車的車型和顏色也同樣,那麼這個世界是多麼地乏味。一個全部風格看上去差很少相同的文檔庫也是同樣。綜合考慮文檔的許多屬性,才能獲得最佳的計效果。編程語言

可是要小心創意過分,好的排版並不能彌補文章本質上的缺陷,如拼寫錯誤、語法不當、結構性差以及內容空洞等。好的文檔風格就像好的編程風格和好的寫做風格同樣,是無形的。內容是文檔的首要目的,文檔風格只是達到這一目的的輔助手段。ide

合適的方式表達思想,參考勾股定理:」直角三角形的斜邊地平方等於兩直角邊的平方和「,能夠用下圖和等式a²+b²=c²來表達這一信息工具

也能夠用歐幾里得表示法oop

根據計算機摩爾定律,咱們能夠存儲愈來愈多的數據,並對其進行愈來愈多的處理,但是在系統執行了大量計算後,咱們又該如何從海量數據中得出大趨勢呢?學習

圖形化輸出

你如何概述拿破崙1812年在俄羅斯戰役中的挫敗?不少程序猿會試着打印出幾十釐米數據(天天的人員數量、軍餉、駐軍地點),法國工程師Charles Joseph Minard在1861年用一種不一樣的方式來描述這個問題:只用一張簡單的圖來總結該戰役。有人評價這多是有史以來最好的統計學繪圖。

 

 

本圖給出了與地圖上的城市、河流等背景相關聯的六個變量:駐軍地點(經緯度)、軍隊規模(和帶寬成比例)、行軍方向、氣溫以及日期,從中能夠看到一支軍隊的毀滅與一個帝國走向滅亡的起點。

最後來幾個書中提到的算法:

隨機取樣

許多隨機取樣要求隨機樣本中沒有重複元素,如下僞代碼爲算法S,這個算法把結構保存在集合S中,若是S的實現正確,而且RandInt產生隨機整數,那麼這個算法生成隨機樣本,每一個M元子集的機率都是

initialize set S to empty

Size := 0

while Size < M do

     T := randInt(1,N)

     if T is not in s then

         insert T in S

         Size := Size + 1
View Code

算法S有不少優勢:正確、至關高效、很是簡潔,彷佛好的不能再改進了。不幸的是Bob Floyd發現,當M=N=100時明顯存在一個缺陷。當Size=99時,集合S缺一個整數。算法閉着眼睛亂猜整數,直到偶然碰上正確的那個爲止,這平均須要猜100個隨機數。這個分析假設隨機數發生器是真正隨機的。對於某些非隨機排列,這個算法甚至不會中止。Floyd開始尋找一個算法,對於S中每一個隨機數只剛好調用一次RandInt。

initialize set S to empty
for J := N - M + 1 to N do
    T := randInt(1,J)
    if T is not in S then
         insert T in S
       else
         insert J in s
View Code

牛頓迭代法計算K維空間兩點距離

T := abs(A[1] - B[1])

Max := T: Sum := T*T

for J := 2 to K do

       T  := 2 to K do

       if T > Max then Max : = T

       Sum := Sum + T*T

if Sum = 0.0 then return 0.0

Eps = 1.0e-7

Z := Max

loop

      NewZ := 0.5 * (Z + Sum/Z)

      if abs(NewZ - Z) <= Eps*NewZ then break

      Z := NewZ

return NewZ
View Code
相關文章
相關標籤/搜索