讀《編程珠璣》有感算法
《編程珠璣》(後文簡稱《珠璣》)在序章中就開宗明義地提出了兩個問題:一個是如何對實際問題進行抽象,找出問題的獨特性質。二是一個富有意思的小題目:「如何在1MB內存內對0~10^7內若干元素組成的集合內的整數進行排序(10s內)」。一開始我想到的是歸併排序,可是書中提出能夠利用位圖的位向量,不用考慮任何排序算法,只須要遍歷兩次便可,突然就有茅塞頓開之感,從這個簡單的例子中就能夠對一些思想窺見一斑:位圖數據結構、簡單的設計、時間-空間的折中……整本書其實都是圍繞這兩點展開,讓我大感裨益。編程
整本書涉及了不少東西,讓我在乎的首先是算法。也許是上學期「數據結構與算法」上機的後遺症,如今對於算法比較敏感。算法與其餘思想地位相同,可是我認爲在通常的編程層面上它具備更重要的影響。例如書中舉出的例子:「給定一個英語詞典,找出其中全部的變位詞集合,例如pots,stop,tops互爲變位詞。」直接處理的話比較複雜,須要大量的計算和比較。因爲咱們只要找到同位詞,其實只要使同位詞編碼相同就能夠。我認爲算法首先是一種有序的思想(固然須要嚴謹的數理邏輯證實),然而僅僅是一種思想還不夠,它還須要可以高效正確地解決問題。做爲一個學習算法的人,咱們不該該認爲算法有着標準答案。事實上,不一樣的問題經常有着不一樣適合的算法。咱們所要作的不僅僅是簡單地從已有的算法中「找」一種最佳的,還應該有着本身的想法。數據結構
那麼實際問題的狀況很是複雜,咱們應該如何結合實際選擇合適的解決方案呢?《珠璣》告訴咱們:要多想。書中有不少這方面的技巧,例如粗略估算中Brooklyn Bridge的設計強度估算,代碼調優等等。然而紙上談兵是不行的,仍是得依靠實踐出真知。就像之前軟工羣裏幾位同窗討論的那樣。讓我印象深入的是羣裏一位比較牛的同窗的闡述,他說他時常重構本身所寫的代碼,由於有時他的選型有更好的選擇。而同時他認爲代碼重構是提高本身能力的一個良好途徑,我深覺得然。我偶爾也重構本身的代碼,而後就會發現之前的本身代碼中的毛病是有多……了,也可以認識到本身應當注重的點在哪裏。而且寫新代碼的過程也是一個鍛鍊本身的過程,有些東西不是說寫過一遍就能保證下次就bug free的(事實上通常不能)。久而久之,不能說保證能成爲牛人,但起碼能在用一個還行的速度敲完代碼以後說一句:「無他,惟手熟爾。」學習
總的體會是這樣子,當中的題目我只是看了幾題,並無時間細作,也算一個小小的遺憾吧。暑假裏爭取可以作一作,在深入體味一下。編碼