算法對設(shè)計關(guān)鍵服務(wù)來說十分重要,它決定了系統(tǒng)的穩(wěn)定性、彈性以及可擴展性。數(shù)據(jù)為媒,算法為介,而在極其重要的算法中,動態(tài)規(guī)劃其實占了很大的比重。
事實上,如果你平常關(guān)注大廠面試的話,你會發(fā)現(xiàn),但凡是研發(fā)崗位,無論是招聘初級還是高級工程師,大廠都傾向于安排一輪或多輪專門的算法面試環(huán)節(jié),而且在面試環(huán)節(jié)提出動態(tài)規(guī)劃相關(guān)問題的這種趨勢已經(jīng)愈發(fā)明顯。
這是為什么呢?我來談?wù)勎业目捶ā?/p>
先說算法這件事吧。我想請你回想一下,當(dāng)處理數(shù)據(jù)結(jié)構(gòu)相關(guān)的問題時,你有沒有這樣的經(jīng)歷?
1. 你本能地到工具函數(shù)或者庫函數(shù)中尋找有沒有現(xiàn)成的工具。如果問題得到快速解決,它是不是迅速就成了過眼云煙?
2. 如果這個問題看起來比較棘手,它不是一個典型的算法問題,那么就尋求搜索引擎的幫助,或者干脆訪問 Stack Overflow 這樣的“智庫”尋找前人留下的解決方案?
3. 雖然平時工作中表現(xiàn)優(yōu)異,但當(dāng)你想換工作參加大廠面試時,又發(fā)現(xiàn)自己難以解決面試官提出的算法問題,無從下手,面對白板“望洋興嘆”?
相信我,你不是一個人!這種現(xiàn)象很普遍。
其實,對于開發(fā)人員來說,算法和數(shù)據(jù)結(jié)構(gòu)就是我們的基本功。我們常常自嘲軟件研發(fā)人員的工作就是復(fù)制粘貼,搬磚就是日常工作的全部。但當(dāng)公司或部門要求你去研究一個全新的技術(shù),或者快速閱讀一份開發(fā)多年且成熟的開源項目代碼,并對其改造來服務(wù)于自己的產(chǎn)品功能時,你的壓力會讓你明白基本功到底有多重要!
關(guān)于基本功這事兒,首先,眾所周知 C++ 不是一門易學(xué)的編程語言,因此,基礎(chǔ)不代表簡單或容易。其次,C++ 能夠極度自由地操縱內(nèi)存資源,如果你有 C++ 的編程基礎(chǔ),那么在學(xué)習(xí) Java 時就會對內(nèi)存管理和控制有更深的見地。
當(dāng)然不是強調(diào) C++ 的重要性了,但如果你有精力學(xué)習(xí) C++ 的話肯定能給你帶來數(shù)不清的好處。其實,我這里真正想表達(dá)的就一點:掌握好基礎(chǔ),能極大地拓寬我們學(xué)習(xí)更多新事物、新技術(shù)的能力。
而算法就像技術(shù)領(lǐng)域的基石,它的穩(wěn)定與否直接決定了大樓最終的高度。那動態(tài)規(guī)劃又起到了什么作用呢?
作為面試官曾接觸過許多優(yōu)秀的候選人,他們有著各種各樣的背景,既有潛力又非常努力,但在面對算法問題和解決問題時沒有太多思路,始終無法更上一層樓,十分遺憾。
而動態(tài)規(guī)劃恰恰是解決問題的重要方法論,面對很多數(shù)據(jù)處理的應(yīng)用場景,它在降低時間復(fù)雜度上極具優(yōu)勢,因此成為了考察重點。不僅如此,動態(tài)規(guī)劃問題還能很好地考察面試者的數(shù)學(xué)模型抽象能力和邏輯思維能力,可以反應(yīng)個人在算法上的綜合能力。
所以我覺得,大廠之所以如此看中一個面試者的算法基礎(chǔ),特別是動態(tài)規(guī)劃問題的解決能力,是因為他們更加看中一位面試者解決問題的思路與邏輯思維能力,而不只是工具與技能的熟練程度。
講到這兒,可能有同學(xué)會想:雖然大廠愛考,但是這東西會不會就是個繡花枕頭?只是在面試中有用,實際工作中用得上嗎?
不同于普通算法,如排序或遞歸,動態(tài)規(guī)劃從名字上看就顯得很特別,有些“高端、大氣、上檔次”的味道在里面。但其實它離我們很近。我舉個例子你就明白了,在云計算平臺上一個解決方案的計算能力(容量)肯定是有限的,那么為了高效服務(wù)那些重要程度或優(yōu)先級最高的客戶,同時又不想浪費計算資源(說白了為了省錢),我們該怎么辦?
這個問題其實可以通過隊列這樣的分發(fā)方式來進行一個簡單的編配。但是這不夠好,如果我們能夠事先知道一個計算任務(wù)的重要程度和所需的計算時長,就可以通過動態(tài)規(guī)劃算法來進行預(yù)演算,從數(shù)學(xué)角度推導(dǎo)出一個嚴(yán)謹(jǐn)?shù)木幣沤Y(jié)果,實現(xiàn)有限資源的最大化利用。
你看,似乎遙不可及的動態(tài)規(guī)劃問題,其實就是求最優(yōu)解問題,它無時無刻都在我們身邊,總是戲劇般地提高了最優(yōu)化問題的性能!這再一次凸顯出大廠為何青睞于動態(tài)規(guī)劃問題,而且成為了區(qū)別面試者的一個隱形門檻。甚至可以說,掌握動態(tài)規(guī)劃思想,在工作面試、技術(shù)等級晉升上都扮演了核心角色??傊痪湓?,動歸必學(xué)。
說到這兒,估計又有同學(xué)會問:我現(xiàn)在知道動態(tài)規(guī)劃很重要了,面試會考,工程實踐要用,但問題是這玩意兒真的難啊,怎么學(xué)?
確實,如果你嘗試去搜索引擎上搜動態(tài)規(guī)劃的話,你會發(fā)現(xiàn),檢索出來的內(nèi)容往往比較凌亂,很難有一個系統(tǒng)的方法帶你從入門到精通。而像“算法面試”這樣的傳統(tǒng)書籍,對動態(tài)規(guī)劃問題的描述也比較匱乏,缺乏實戰(zhàn)經(jīng)驗,閱讀和學(xué)習(xí)起來枯燥無味,過目就忘。
我以前也有過這種困擾。不過,近些年來在工作中用到動態(tài)規(guī)劃的場景越來越多,在積累了大量的實戰(zhàn)經(jīng)驗后,再結(jié)合上面試經(jīng)歷,我發(fā)現(xiàn)還真的可以做一個較為系統(tǒng)的專題,針對動態(tài)規(guī)劃面試題做一次深入的探討,也就有了這門課。
希望這個專欄,能夠為你提供一個較為全面的動態(tài)規(guī)劃知識庫,兼顧理論基礎(chǔ)和有效的經(jīng)驗總結(jié),而非照本宣科的理論描述。同時,我也希望它能夠為你提供一條捷徑,幫助你更快地掌握動態(tài)規(guī)劃問題,從容地應(yīng)對面試。
為此,打磨了以下三個模塊。
模塊一:初識動態(tài)規(guī)劃
會為你講解復(fù)雜面試題的思考和解決方式。從貪心算法開始,一步步闡述動態(tài)規(guī)劃的由來,并通過一個貫穿全篇的例子來展現(xiàn)動態(tài)規(guī)劃的強大之處。學(xué)習(xí)和掌握這些經(jīng)典的處理方法,能夠為你后續(xù)掌握動態(tài)規(guī)劃打下一個堅實基礎(chǔ)。
通過這部分內(nèi)容,會系統(tǒng)了解到動態(tài)規(guī)劃問題的特點和解題經(jīng)驗。
模塊二:動態(tài)規(guī)劃的套路
會講解動態(tài)規(guī)劃問題的解題框架和套路,你可以把這個套路理解成是解決動歸問題的模板。在此模板的基礎(chǔ)上,我會向你講解面試真題,有針對性地套用解題框架。而應(yīng)對面試題的紛繁復(fù)雜,我會為你進行有效的分類,并針對每一種動態(tài)規(guī)劃問題進行深入而全面的講解。
通過這部分內(nèi)容,會快速掌握常見面試題的解題套路。
模塊三:舉一反三,突破套路
會針對幾種特別易考的動態(tài)規(guī)劃面試題進行總結(jié),幫助你攻破套路。并在這些高級話題的基礎(chǔ)上,提出設(shè)計動態(tài)規(guī)劃算法的關(guān)鍵問題。另外,還有刷題指南,所謂孰能生巧,必要的練習(xí)我們還是要的。
通過這部分內(nèi)容,會快速掌握動態(tài)規(guī)劃面試題的進階法門。文章來源:http://www.zghlxwxcb.cn/news/detail-828235.html
最后,十分理解,動態(tài)規(guī)劃是絕大多數(shù)人在面試中的一個老大難問題。有很多人因為它停了下來,錯失了機會。掌握動態(tài)規(guī)劃算法,無論是從工程實踐還是面試上來說,都充滿必要性。所謂大廠,帶給我們的不僅僅是品牌光環(huán)那么簡單,更多的是人生的一個全新階段和嶄新的臺階。文章來源地址http://www.zghlxwxcb.cn/news/detail-828235.html
到了這里,關(guān)于開篇詞|為什么大廠都愛考動態(tài)規(guī)劃?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!