正兒八經開始學算法了,沒有學習算法以前,總以爲編程就是敲代碼,知道怎樣使用語言就好了,學習了算法以後,才知道這玩意大有用處,並且和數學有很是緊密的聯繫。雖然我數學不太好,可是我對數學有一種天生的好感,由於它們老是給人帶來一種驚豔感。或許是小時候並不懼怕數學的緣故吧,因而勉強堅持一下,老師所講的那些動態規劃、貪心算法竟然能聽懂了。可是看起《TAOCP》倒是真正地無所適從,隨時都有一種想要扔下書去幹別的的感受,而碰到容易的時候、本身可以理解就會很是地開心。
算法這種東西,的的確確須要很大的數學功底。我數學功底很差,該怎麼拌?我就一行行照着敲代碼,敲到我理解整個過程爲止。或者對於個人「成果」(敲出來的代碼)一行行進行調試,調試一遍就理解程序的基本原理了,可是本身仍是寫不出來。固然碰到各類遞歸,分治,調試的時候就超級沒有耐心了,跳躍太頻繁,人腦是難以接受的。好比一個quick sort ,先來一個partition,而後就遞歸解決前半部分和後半部分。真的是神奇,一樣是排序算法,有的算法(快排)天生就比另一些算法(冒泡、插入)更快,固然並不能一律而論,各類算法都有本身的侷限以及長處。就像數據結構裏面同樣,順序表和鏈式表都有各自的優勢,可是也有各自的缺點,只有因時而異,因地制宜才能發揮它們最大的功效。算法也是同樣,insert sort在樣本少的時候是很是方便的,代碼也少,適合那些順序差很少和目的順序相同的樣本空間。而上述狀況對於快排來講就是厄運的到來了,由於它們的思想徹底不一樣,有序狀況對快排來講是最糟糕的了,由於要partition打亂了,跳躍性太強,須要再繼續排。
關於排序算法,記得還收藏過了一個排序的全集歌舞,用舞蹈的形式來展現排序的原理,比較容易懂。連接在
這裏。不少書上說計算機的世界裏面不少須要排序的東西,而排序算法,便成了咱們這堆初出茅廬的rookie們的必經之路。一大堆的排序算法,估計是各IT公司面試時最常考的東西,之前看的《瘋狂的程序員》絕影最常被考的就是冒泡排序。而今天,對本身的要求固然不只僅是能寫幾個排序,而更是要學會設計算法的本領,提升咱們的產能,到時候產出天然就大了。前幾天,搭車去本部參加ACM的初賽,竟然很簡單的問題想不出來,怪的就是沒有算法的素養,對於題目的分析,解構,以及建模的能力不夠,用慣了蠻力破解,卻吃盡苦頭編出一個超出時間要求的算法,好的算法每每須要一些基本功:遞歸、動態規劃等的時候,就不知道從何處下手。結果可想而知——鎩羽而歸。固然,這也只是現階段的狀況而已,隨着算法課程的推動,咱們仍是可以比較系統地接觸各類算法,從而養成良好的算法素養,到時候就更輕鬆了。
今天讀到一篇hack news說一個音樂生,跟着一個老師學才兩年就大學畢業了,一我的真的能夠學得很快,質的飛躍也每每只是須要半年的時間而已。而若是遇到了適合本身胃口的老師講課,那麼效率便會大大提升。咱們於日常的學習中浪費了太多的時間,時間的確像海綿,可是擠出來的都浪費在別處去了。因此更難能難得的是合理地管理本身,把重要知識掌握了,或者開闢一個大的時間內存,用於高效地運行一個「做業」。計算機可以分時、可以多進程、多線程,雖然從宏觀上來說,咱們也是能夠多進程的,可是就一個較短的時間段來講,咱們仍是應當高效地利用時間來學習重要的課程——數據結構和算法。也許讀完了《算法導論》就能夠很快上道了,要是能硬着頭皮把《TAOCP》讀完了,也就算得上是學有所成了。對於算法學習,頗有必要給本身一個時間範圍,給本身一個原則:「真的弄懂學習的算法,並在恰當的時候可以用上」。並且,愈來愈感受到代碼給人的直觀性,敲過以後印象會更深入。什麼聽懂了,看懂了,都是屁話,只有拉出來可以本身隨手寫一個纔是真正的懂了。
以一個很驚奇的結果作結尾,作爲啓示:世界上的事物並不是平白無故的,而是有着千絲萬縷的聯繫,而這種聯繫又是如此的精妙。就在你認爲是毫無聯繫的狀況下,有人發現了奇妙的聯繫。
project euler 052:找出一個數x,這個數的一、二、三、四、五、6倍都是由相同的一些數字組成,並且位數相同,求出這個數x。
咋一看,就是用Bruce 方法來破解,去試一試這些全部可能的結果。我苦逼了半天,辛辛苦苦地寫出十幾二十行代碼,求得了正確的結果,但是看到反饋的第一條就是,這我的壓根沒有用計算機,就算得告終果,我十分地驚訝。
這我的說 1/7 = 0.142857... 而2*142857 = 285714; 3*142857 = 428571 ;4*142857 =571428 ;5*142857= 714285;6*142857=857142 真的是很是神奇!! 而7*142857 =999999
你如今你敢說這些數位和6是不要緊的了嗎?畢竟6和7有很大關係。而這之間的關係到底有多麼深層呢,本質又是什麼呢?這估計要去問羣論的科學家了吧!
從中我悟到一個道理,那就是,算法要充分利用事物之間的聯繫:聯繫說不定就隱藏在表象的深層,充分利用聯繫的算法纔是好的算法。
by bibodeng 2012-03-28