對算法和數(shù)據(jù)結(jié)構(gòu)的態(tài)度

疑問

  • 有沒有必要親手實現(xiàn)甚至是背誦復雜算法的實現(xiàn)?對于找工作的幫助有多大灭衷?還說是必須的?

  • 復雜算法的熟悉程度是不是代表著一個程序員的水平旁涤?如何增強算法和數(shù)據(jù)結(jié)構(gòu)能力翔曲?

  • 怎么定義復雜算法這個詞,多復雜算是復雜的劈愚,各種排序瞳遍,紅黑樹,KMP菌羽,鏈表數(shù)據(jù)結(jié)構(gòu)掠械,什么是必須的,什么是理解為主?

小論

算法和數(shù)據(jù)結(jié)構(gòu)學習的意義

從碼農(nóng)到高級的程序員猾蒂,實際上水平差別很大均唉,對于算法,理解了之后不一定真正寫出來能運行肚菠,運行的也不一定夠健壯

基本要求就是舔箭,記住是什么,理解并鉆研吃透蚊逢,如果目標不僅僅是碼農(nóng)而是更高層次的程序員层扶,那就是必須的素養(yǎng),論程序員的自我修養(yǎng)

算法的的出現(xiàn)必然伴隨著問題和應(yīng)用場景时捌,為什么這個算法會是最合適的解決方案怒医,之后才是實現(xiàn)細節(jié)

算法數(shù)據(jù)結(jié)構(gòu)的必須

面試筆試肯定會有算法和數(shù)據(jù)結(jié)構(gòu)相關(guān)的內(nèi)容,必須掌握奢讨,越多越好,自己用事件成本去權(quán)衡就好

如何衡量職業(yè)技能焰薄?如果沒有履歷背書拿诸,名校背景,基礎(chǔ)知識和實際作品將會成為衡量的底線

剛畢業(yè)也好塞茅,貫穿整個職業(yè)生涯也罷亩码,找工作相關(guān)的內(nèi)容永不過時,只要大家覺得還有價值野瘦,面試官覺得需要掌握描沟,那就需要

內(nèi)容層次的掌握

凡事從簡到難更符合規(guī)律,對于不同的水平的人鞭光,算法是否復雜也會得出不同的結(jié)論吏廉,凡人的難題對神人不值一提

字符串,數(shù)組惰许,哈希表席覆,二叉樹等等這些簡單常用并且也是常考的汹买,之后紅黑樹就會更有底氣佩伤,一步一步慢慢來

對于實現(xiàn)的熟悉和理解的確會代表一個程序員的部分水平,還是要學習一個

背誦默寫代碼本身晦毙,除了筆試的時候生巡,基本上并沒有什么用,對于一個的算法的學習要點還是要放在见妒,算法本身是什么孤荣,目的,原理,應(yīng)用場景垃环,以及使用的方式方法邀层;需要記住的點有,算法本身解決了什么問題遂庄,有哪些好處寥院,以及其中的一些線索,這樣子可以在需要的時候重新推導出來(和數(shù)學的學習方式有點相似)涛目;如果再深入秸谢,就是優(yōu)缺點和類似算法的橫向比較,如何改進及優(yōu)化

算法和數(shù)據(jù)結(jié)構(gòu)的學習方式

貼上Robert Love在Quora上寫的文章霹肝,如何增強數(shù)據(jù)結(jié)構(gòu)和算法能力下面的答案-How do I strengthen my knowledge of data structures and algorithms?

Robert Love, Software Engineer at Google

I see it time and again in Google interviews or new-grad hires: The way data structures and algorithms—among the most important subjects in a proper computer science curriculum—are learnt is often insufficient. That's not to say students read the wrong books (see my recommendation below) or professors teach the wrong material, but how students ultimately come to understand the subject is lacking.

不是我們不努力估蹄,奈何敵人有高達,大家其實都有誤區(qū)沫换,不是老師不行臭蚁,也不是學生不行,大概

The key to a solid foundation in data structures and algorithms is not an exhaustive survey of every conceivable data structure and its subforms, with memorization of each's Big-O value and amortized cost. Such knowledge is great and impressive if you've got it, but you will rarely need it. For better or worse, your career will likely never require you to implement a red-black tree node removal algorithm. But you ought be able—with complete ease!—to identify when a binary search tree is a useful solution to a problem, because you will often need that skill.

一般來講你可能不會需要手擼一個算法實現(xiàn)出來讯赏,當然能擼出來算你厲害垮兑,但是實際上一般人的關(guān)鍵不在于糾結(jié)各個算法的細節(jié);更有用的是漱挎,當你遇到某個特定問題的時候系枪,知道哪一個算法是合適的解決方案,這才是關(guān)鍵

So stop trying to memorize everything. Instead, start with the basics and learn to do two things:

放下手中的筆磕谅,放棄單純死記硬背手擼代碼私爷,開始做下面兩件事情

  • Visualize the data structure. Intuitively understand what the data structure looks like, what it feels like to use it, and how it is structured both in the abstract and physically in your computer's memory. This is the single most important thing you can do, and it is useful from the simplest queues and stacks up through the most complicated self-balancing tree. Draw it, visualize it in your head, whatever you need to do: Understand the structure intuitively.

數(shù)據(jù)結(jié)構(gòu)的可視化,讓算法生動起來膊夹,他們看起來是什么樣子衬浑,用心感受一下。從最簡單的結(jié)構(gòu)到最復雜的結(jié)構(gòu)割疾,在腦中有一個直觀的印象嚎卫,無論如何要直觀理解數(shù)據(jù)結(jié)構(gòu)

  • Learn when and how to use different data structures and their algorithms in your own code. This is harder as a student, as the problem assignments you'll work through just won't impart this knowledge. That's fine. Realize you won't master data structures until you are working on a real-world problem and discover that a hash is the solution to your performance woes. But even as a student you should focus on learning not the minutia details but the practicalities: When do you want a hash? When do you want a tree? When is a min-heap the right solution?

學習什么時候,以及用什么方式將不同的數(shù)據(jù)結(jié)構(gòu)和算法應(yīng)用到代碼中宏榕。

One of the questions I ask in Google engineering interviews has a binary search tree as a potential solution (among others). Good candidates can arrive at the binary search tree as the right path in a few minutes, and then take 10-15 minutes working through the rest of the problem and the other roadblocks I toss out. But occasionally I get a candidate who intuitively understands trees and can visualize the problem I'm presenting. They might stumble on the exact algorithmic complexity of some operation, but they can respond to roadblocks without pause because they can visualize the tree. They get it.

As for a book, there is but one: Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein, otherwise known as CLRS.

算法書那必稱算法導論拓诸,沒話說

If you want another text, perhaps one with more examples in a specific language, I recommend Robert Sedgewick's Algorithms in C++ or Algorithms in Java, as appropriate. I prefer CLRS as a text, but you might find these a better teaching aid.

還有一些書咯,Algorithm in C++ 和 Algorithm in Java

  • 數(shù)據(jù)可視化網(wǎng)站推薦

Data Structure Visualization

VisuAlgo - visualising data structures and algorithms through animation

擴展一下思路麻昼,在學習其他的CS基礎(chǔ)課的時候奠支,都要捫心自問一些問題來拯救自己點歪的技能樹,多問自己為什么會這么設(shè)計抚芦,要是自己來做會怎么辦

下文引用自網(wǎng)絡(luò)

學習操作系統(tǒng)倍谜,需要理解為什么會有OS這個東西迈螟,如何沒有OS會怎么樣;OS提供給用戶哪些抽象尔崔、它又是怎么管理硬件的答毫;進程是怎么管理和調(diào)度的,死鎖是怎么產(chǎn)生和解決的季春,內(nèi)存是怎么管理洗搂,文件系統(tǒng)有什么用以及是如何實現(xiàn)的,最好再就一個具體的操作系統(tǒng)(比如xv6)研究這些原理是怎么應(yīng)用的载弄;而不是開機啟動的詳細步驟耘拇,當然你知道最好。

學習計算機組成原理宇攻,需要理解的是為什么在這個高級語言泛濫的時代我們還需要學習匯編惫叛,計算機是如何一步一步發(fā)展到如今這個組成結(jié)構(gòu)的,為什么單周期實現(xiàn)的cpu效率不高逞刷,之后的流水線cpu是如何改進單周期的以及其設(shè)計中的挑戰(zhàn)是什么嘉涌,由流水線引發(fā)的hazard有哪些以及怎么處理,forwarding又是怎么實現(xiàn)夸浅;而不需要背下來每一級流水線寄存器是哪些洛心,因為現(xiàn)代cpu實現(xiàn)一般都是15級以上的流水線stage,除非你是cpu設(shè)計者否則背了根本沒用题篷。

學習計算機體系結(jié)構(gòu),需要理解常用的并行方法厅目,并知道每一種并行方法里的具體手段番枚,比如instruction-level parallelism中,需要理解Instruction pipelining损敷,Out-of-order execution葫笼,Register renaming,Speculative execution等技術(shù)到底干了什么達到改善的目的拗馒,知道這些的目的是為了幫助你在程序里合理地組織代碼和數(shù)據(jù)來最好地發(fā)揮CPU功能路星,而不是為了讓你設(shè)計一個新的CPU。另外诱桂,處理器設(shè)計中包括了許多工程實踐中的很好的原則洋丐,學習它可以幫助你理解和解決別的領(lǐng)域的問題。

學習編譯原理挥等,需要理解的是一個編譯器實現(xiàn)的幾個步驟(詞法分析友绝、語法分析、語義分析肝劲、運行時環(huán)境迁客、中間代碼郭宝、代碼生成、代碼優(yōu)化)以及一些關(guān)鍵算法掷漱。學詞法分析你需要理解狀態(tài)機粘室、學語法分析你至少需要知道LL自頂向下和LR自底向上的算法,以及為什么需要把我們的程序轉(zhuǎn)成抽象語法樹卜范。學運行時環(huán)境需要理解程序是怎么存儲衔统、裝載和執(zhí)行的。代碼優(yōu)化的時候需要知道最常見的優(yōu)化方法先朦。

學習計算機網(wǎng)絡(luò)缰冤,需要理解的是整個全球互聯(lián)網(wǎng)是怎么運作的以及5層模型(應(yīng)用層、傳輸層喳魏、網(wǎng)絡(luò)層棉浸、數(shù)據(jù)鏈路層、物理層)中上層和下層是怎么交互的刺彩∶灾#可能對大部分開發(fā)者有用的是應(yīng)用層和傳輸層TCP/UDP的原理,重點是TCP原理的理解:為什么TCP是一個可靠協(xié)議创倔?它為了“可靠”付出了什么代價嗡害?TCP為什么要握3次手而不是4次5次6次?為什么結(jié)束TCP連接需要4次揮手而不是5次6次畦攘?TCP的重傳機制是怎么實現(xiàn)的霸妹?為什么要引入滑動窗口的概念?以及需要理解Congestion control的核心算法是怎樣的知押。

學習數(shù)據(jù)庫原理叹螟,重點不是讓你知道sql怎么寫,而是讓你理解如何設(shè)計正確的schema台盯,在這個過程中為了消除數(shù)據(jù)冗余罢绽、插入/刪除/修改異常會逼著你理解那幾種范式(1NF、2NF静盅,3NF良价,BCNF),以及思考一個功能完整蒿叠、效率高的數(shù)據(jù)庫是怎么實現(xiàn)明垢,重點是原理的學習,比如在學習transaction的ACID性質(zhì)的時候栈虚,這四點分別代表什么意思袖外,以及是怎么實現(xiàn)它們的?如何實現(xiàn)一個高效的數(shù)據(jù)庫這個話題就太大了魂务,不展開了曼验。

總結(jié)一下泌射,為了讓自己更高效地學習這些課,介紹一個我一直在用的方法鬓照,就是在學習這些課的同時熔酷,不斷地問自己,“這個設(shè)計/算法為什么是這樣的豺裆,而不是那樣的拒秘。如果讓我來解決這個問題,我會怎么做”臭猜。

資源

算法相關(guān)的面試真題

Leetcode.com

數(shù)據(jù)可視化網(wǎng)站

Data Structure Visualization

搭梯子也無法訪問的VisualGO-VisuAlgo - visualising data structures and algorithms through animation

厲害的鏈接

朱佳順同學的知乎

朱佳順同學的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躺酒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蔑歌,更是在濱河造成了極大的恐慌羹应,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件次屠,死亡現(xiàn)場離奇詭異园匹,居然都是意外死亡,警方通過查閱死者的電腦和手機劫灶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門裸违,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人本昏,你說我怎么就攤上這事供汛。” “怎么了涌穆?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵紊馏,是天一觀的道長。 經(jīng)常有香客問我蒲犬,道長,這世上最難降的妖魔是什么岸啡? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任原叮,我火速辦了婚禮,結(jié)果婚禮上巡蘸,老公的妹妹穿的比我還像新娘奋隶。我一直安慰自己,他們只是感情好悦荒,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布唯欣。 她就那樣靜靜地躺著,像睡著了一般搬味。 火紅的嫁衣襯著肌膚如雪境氢。 梳的紋絲不亂的頭發(fā)上蟀拷,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機與錄音萍聊,去河邊找鬼问芬。 笑死,一個胖子當著我的面吹牛寿桨,可吹牛的內(nèi)容都是我干的此衅。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼亭螟,長吁一口氣:“原來是場噩夢啊……” “哼挡鞍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起预烙,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤墨微,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后默伍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欢嘿,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年也糊,在試婚紗的時候發(fā)現(xiàn)自己被綠了炼蹦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡狸剃,死狀恐怖掐隐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钞馁,我是刑警寧澤虑省,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站僧凰,受9級特大地震影響探颈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜训措,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一伪节、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绩鸣,春花似錦怀大、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捡多,卻和暖如春蓖康,著一層夾襖步出監(jiān)牢的瞬間铐炫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工钓瞭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驳遵,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓山涡,卻偏偏與公主長得像堤结,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸭丛,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容