演算法題概念初解

演算法,在CS專業學習階段經常被提及的一個詞語,相信每個人都或多或少有接觸,都有自己的理解,可謂是一千個coder有一千種對演算法的理解,這裡我想談談自己對於接觸了一年多的演算法題目的理解。

演算法題是什麼:

我所理解的是:給定一種信息約束(或通俗的說是給定一種需求),以及相應的輸入,希望得到符合要求的輸出。

這其實是一個很普遍的概念,CS專業中所有的需求都擴展在這個概念之上,一個大型的系統也是由這樣一個個小的組件搭建而成,每個部件完成它對於輸入到輸出的轉換,再將輸出傳遞給其他的部件,這樣才像搭積木一樣將一個大型的軟體架構出來,而部件的成功與質量的好壞則影響著整個系統。

而這種概念最終目的則在於——培養解決問題的思維。演算法題目與工業需求的差別在於它去除了許多工程方面的影響因素,弱化了非思維因素的權重,更聚焦在問題解決的思路上,旨在培養一種思維能力,所以有許多人認為優秀的競賽選手不意味著優秀的工程實踐者,原因在於優秀的競賽者它的優秀是體現在思維能力上,這種優勢體現在職業生涯的長度與高度上,而不是落實到初期的具體領域。

當我們做題目的時候我們做了什麼:

對於解決一個演算法題,在我看來分為兩大步驟

  • 邏輯建模
  • 語言化

邏輯建模意為建立一個能解決這一通類問題的邏輯模型

語言化則是將這一個邏輯模型轉化為編程語言,交由計算機去執行

其中邏輯建模是對思維能力的綜合考驗,語言化則是在於編程能力的體現,我將通過下述的幾個例子來闡明這兩個過程

我們先來看一個簡單的演算法題:Two Sum(兩數之和)

給定一個整型數組,是否能找出其中兩個數使其和為某個特定的值

這道題很簡單,當我們不去考慮如何用計算機實現的時候,單純思考並用自然語言描述解決辦法出來,這就是邏輯建模的過程,這裡我們第一反應自然就是從第一個數字開始,然後分別與它後面的數字相加再和目標數字做比較,如果不等,再從第二個數字開始,分別與第二個數字後面的數字相加再和目標數字做比較,以此類推,直到找到符合條件的情況發生。這便是對於這一類問題的通用解決辦法,然後再是將它轉換成自己熟悉的編程語言去實現它。

也許這個例子太簡單了讓你覺得我說的話沒有意義,但這裡我引用這個例子的目的在於說明:對於任何演算法題,簡單或困難,都會存在這兩個過程,也許簡單的問題會讓你的大腦瞬間建模完畢,所以你可以立馬著手將它語言化,但如果長期適應於這種情況下,會讓你的大腦逐漸忽略邏輯建模這一步,以至於更注重於語言化。在面對困難的建模問題的時候,這將會阻礙你的思考,在你沒有得到一個完整的清晰的模型時就妄動手指,必然會讓你陷入模型與語言各種細節交織的陷阱中,所以,重視邏輯建模這一步是解決問題的重中之重。

我們再來另外一個非常有名且稍有難度的題目:01背包問題

一個背包總容量為V,現在有N個物品,第i個物品體積為weight[i],價值為value[i],現在往背包裡面裝東西,怎麼裝能使背包內的物品價值最大?

例如:背包容量V=5,一共有N=4個物品,4個物品的{價值,重量}分別為 {3,2},{2,1},{4,3},{2,2}

在這樣的小規模數據下,我們人可以簡單的識別出正確答案是7,也就是把第1,2,4個物品放到背包中去。可是當物品有幾百個,幾千個的時候呢?肉眼還能簡單的識別出來嗎?許多時候都會存在我們人可以找到正確答案,但是卻無法第一時間建立一個模型來描述人是如何解決這個問題的,演算法題目真正的困難所在,就是這裡——你能回答出正確的題目樣例,但是你無法建立相應的模型,而邏輯都沒確定下來,妄動手指必然只讓會你的思緒更加混亂。

而上述題目的模型其實也很簡單,其實就是對於每一個物品放與不放兩種情況都做考慮,然後再分別去計算後續的情況

這裡不做過多解釋,感興趣的同學可以去看我相關文章DP解析。

說了許多邏輯建模的,再來說說語言化,這個過程則是主要靠練習,大部分刷題主要提升的則是這個過程,通過做大量的各類型的題目,這些題目的模型多種多樣,每種模型都用代碼實現過後,下次再碰到相似的模型,就能快速將它語言化,從而節省更多的時間,提高更多的效率。

在此之後:

當了解了這些基礎的認知後,我們才能真正的開始學習演算法。畢竟沒有演算法理論的支持,我們邏輯建模出來的模型都是最原始的,樸素的,或者說是低效率的,就像上述舉例的兩個演算法題。而演算法的作用則是改善已有的低效率的模型,熟練之後則能讓你直接建立出高效率的模型,甚至是給你一個全新的視角去看待這個問題,這時候才是思維能力得到質的飛躍的時候。

演算法重要嗎:

這是一個充滿異議的卻又毋庸置疑的問題,我是非常推薦學生去搞演算法競賽的,也有人反駁我的觀點,這個世界上確實有大量不是有著競賽經歷的優秀CS工作者,但是它們當中沒有一個不是有著優秀思維能力的CS工作者,能提高自己的路徑有許多條,條條大路通羅馬,只不過演算法競賽這一條或許是最廣為人接受,馬路最寬敞的一條罷了,有著許多優秀的案例。

然後最終的選擇權在自己手上,想怎麼走都可以,只要不停下來就是前進。


推薦閱讀:

零基礎跨考計算機專業的話,開始要看什麼書入門呢?
計算機專業的學生編程練習從哪裡開始?
大學想讀計算機,去成電還是北交?
IT行業的技術人員年齡偏大之後如何轉型?

TAG:算法 | 计算机科学 | 计算机专业 |