1. 程式人生 > >第8周讀書筆記-讀《編程珠璣》有感

第8周讀書筆記-讀《編程珠璣》有感

印象 高效 其他 兩個 抽象 速度 算法 idg 如何

讀《編程珠璣》有感

《編程珠璣》(後文簡稱《珠璣》)在序章中就開宗明義地提出了兩個問題:一個是如何對實際問題進行抽象,找出問題的獨特性質。二是一個富有意思的小題目:“如何在1MB內存內對0~10^7內若幹元素組成的集合內的整數進行排序(10s內)”。一開始我想到的是歸並排序,但是書中提出可以利用位圖的位向量,不用考慮任何排序算法,只需要遍歷兩次即可,忽然就有茅塞頓開之感,從這個簡單的例子中就可以對一些思想窺見一斑:位圖數據結構、簡單的設計、時間-空間的折中……整本書其實都是圍繞這兩點展開,讓我大感裨益。

整本書涉及了很多東西,讓我在意的首先是算法。也許是上學期“數據結構與算法”上機的後遺癥,現在對於算法比較敏感。算法與其他思想地位相同,但是我認為在一般的編程層面上它具有更重要的影響。例如書中舉出的例子:“給定一個英語詞典,找出其中所有的變位詞集合,例如pots

stoptops互為變位詞。”直接處理的話比較復雜,需要大量的計算和比較。由於我們只要找到同位詞,其實只要使同位詞編碼相同就可以。我認為算法首先是一種有序的思想(當然需要嚴謹的數理邏輯證明),然而僅僅是一種思想還不夠,它還需要能夠高效正確地解決問題。作為一個學習算法的人,我們不應該認為算法有著標準答案。事實上,不同的問題常常有著不同適合的算法。我們所要做的不單單是簡單地從已有的算法中“找”一種最佳的,還應該有著自己的想法。

那麽實際問題的情況非常復雜,我們應該如何結合實際選擇合適的解決方案呢?《珠璣》告訴我們:要多想。書中有很多這方面的技巧,例如粗略估算中Brooklyn Bridge的設計強度估算,代碼調優等等。然而紙上談兵是不行的,還是得依靠實踐出真知。就像以前軟工群裏幾位同學討論的那樣。讓我印象深刻的是群裏一位比較牛的同學的闡述,他說他時常重構自己所寫的代碼,因為有時他的選型有更好的選擇。而同時他認為代碼重構是提升自己能力的一個良好途徑,我深以為然。我偶爾也重構自己的代碼,然後就會發現以前的自己代碼中的毛病是有多……了,也能夠認識到自己應當註重的點在哪裏。並且寫新代碼的過程也是一個鍛煉自己的過程,有些東西不是說寫過一遍就能保證下次就bug free

的(事實上一般不能)。長此以往,不能說保證能成為牛人,但起碼能在用一個還行的速度敲完代碼之後說一句:“無他,唯手熟爾。”

總的體會是這樣子,當中的題目我只是看了幾題,並沒有時間細做,也算一個小小的遺憾吧。暑假裏爭取能夠做一做,在深刻體味一下。

第8周讀書筆記-讀《編程珠璣》有感