到底該怎么學(xué)習(xí)算法
A: 我到底該怎么學(xué)習(xí)算法呀?
B: 回答這個問題前,我們先來舉個例子:如何實現(xiàn)“把大象裝進(jìn)冰箱”?

A: ? 三步。第一步,把冰箱門打開,第二步,把大象裝進(jìn)去,第三步,把冰箱門帶上。
B: ?在這個程序中,大象、冰箱,是數(shù)據(jù),而“如何把大象裝進(jìn)冰箱”,就是這個程序的算法。
B: ? 算法一:把大象放在冰箱前,把冰箱門打開,把大象裝進(jìn)去。算法二:把冰箱門打開,把大象放在冰箱門前,然后把大象裝進(jìn)去。算法三:把大象放在冰箱前,把冰箱門打開對準(zhǔn)大象,然后把冰箱向著大象推動直至把大象裝進(jìn)去。
B: ? 實現(xiàn)一種需求,可以設(shè)計出多種算法,并且,算法在很大程度上決定了你寫出的程序漂不漂亮、巧不巧妙,所以我們學(xué)習(xí)算法的目的是為了在寫程序時能夠設(shè)計出更優(yōu)化的方案。
B: ?對于初學(xué)者來說,可以分成三個階段進(jìn)行算法的學(xué)習(xí),循序漸進(jìn),逐步深入。
A: ?快給我講講
B : 第一階段:基于語言去學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),繼續(xù)舉大象的例子。一個把十頭大象裝進(jìn)冰箱的程序,首先要解決的問題是:如何存放這十頭大象。你可以把這十頭大象用繩子挨個串起來,這樣即使大象會亂跑,但只要你一直抓著繩子頭,就可以順藤摸瓜,把十頭大象都找到;或者,你可以制作十個緊挨著的格子,然后把每頭大象依次放到格子中,這樣大象就不會亂跑。在這里我們可以看到,同樣是存放十頭大象,我們設(shè)計出了兩種不同的方式,這兩種對大象(數(shù)據(jù))的存放方式,就是“數(shù)據(jù)結(jié)構(gòu)”。

B: ?每種語言都有一些數(shù)據(jù)結(jié)構(gòu),因此可以通過自己熟悉的語言先對數(shù)據(jù)結(jié)構(gòu)進(jìn)行了解。

A: ?那第二個階段是什么呢?
B: ? 第二階段:基于數(shù)據(jù)結(jié)構(gòu)去學(xué)習(xí)基本的算法。

B: ? 在對數(shù)據(jù)結(jié)構(gòu)有了一定了解的基礎(chǔ)上,就可以對常用的算法進(jìn)行學(xué)習(xí)了。比如最基本的各種不同的排序方法:冒泡排序法、選擇排序法等等。在此期間,可以加強對“時間復(fù)雜度”這一概念的了解,同時開始學(xué)習(xí)一些更高級的數(shù)據(jù)結(jié)構(gòu)。

Online Judge會給你一個簡單的問題,然后讓你編程解決,系統(tǒng)會有很多測試樣例。如果你的代碼可以通過所有的測試樣例,那么說明你的代碼邏輯上是正確的。同時OJ都會有一定的內(nèi)存使用與運行時間限制,過于低效或耗費大量非必要空間的算法將不會通過測試。
A: 那最后一個階段是啥呢?
B : 第三階段:基于具體需要和個人興趣進(jìn)階
B: 如果只是要滿足基本使用或大多數(shù)工作中的需求,那么完成第二階段基本就足夠了(除非你是專門研究算法的)。
