開篇
這個(gè)系列坑主要圍繞 leetcode 和基本數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)娩梨。我大概是第三次刷 leetcode 了铣鹏,第一次是大學(xué)玩 ACM 的時(shí)候熱身刷透典,用c++表達(dá)赎败。第二次是一年多前面試 facebook 前端時(shí)刷了一下秕衙,但沒有刷完。最近想用js表達(dá)再刷一次發(fā)布出來僵刮。
數(shù)據(jù)結(jié)構(gòu)與算法据忘,顧名思義就是 數(shù)據(jù)結(jié)構(gòu)+算法。數(shù)據(jù)結(jié)構(gòu)為了存儲(chǔ)設(shè)計(jì)一個(gè)面向存儲(chǔ)的實(shí)現(xiàn)方式搞糕,為了程序接觸方便則需要拗一個(gè)數(shù)據(jù)的造型勇吊,所以主要就分為存儲(chǔ)方式+造型(結(jié)構(gòu))。算法說白了就是一些程序邏輯窍仰,作用在數(shù)據(jù)結(jié)構(gòu)上汉规,為了實(shí)現(xiàn)一個(gè)需求。首先,需求要滿足针史,需要對(duì)它測試晶伦。其次在滿足需求的前提下通過一些評(píng)價(jià)指標(biāo),比如時(shí)間空間復(fù)雜度來評(píng)價(jià)這個(gè)方案并優(yōu)化它啄枕。最后婚陪,我們需要清晰的表達(dá)出我們的邏輯,要追求 clean code频祝,讓大家一目了然通讀泌参。
思想
我自己參加過很多面試,也面試過很多人常空,一些同學(xué)對(duì)算法是抵觸的沽一,覺得好像就是一個(gè)理論體系。其實(shí)不然漓糙,一到算法題你可以當(dāng)做一個(gè)工程題铣缠。產(chǎn)品經(jīng)理提的需求就是一個(gè)input和一個(gè)output,并且對(duì)你的性能有所要求昆禽,關(guān)鍵是這個(gè)需求不會(huì)改攘残!那么我們?cè)撛趺醋觯慨?dāng)然首先把 文字轉(zhuǎn)換為數(shù)據(jù)为狸,通過我們選擇的語言變成一個(gè)你想實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),比如我用數(shù)組遗契,我用鏈表辐棒,我用樹。這都o(jì)k牍蜂,目的就是為了在計(jì)算機(jī)中表達(dá)出這個(gè)數(shù)據(jù)漾根。至于到底選什么當(dāng)然會(huì)根據(jù)性能根據(jù)需求而定,你可以放大并把它理解為技術(shù)選型鲫竞。當(dāng)然這些基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)本身也有一些模版代碼辐怕,比如樹怎么實(shí)現(xiàn),鏈表怎么實(shí)現(xiàn)从绘。這些數(shù)據(jù)結(jié)構(gòu)上一定需要綁一些邏輯寄疏,最后輸出成output。這些邏輯本身會(huì)有副作用僵井,于是我們拿到一定也會(huì)先把需要用到的副作用變量申明好陕截,命名好。比如樹的遍歷批什,我一定需要一個(gè)當(dāng)前的緩沖值农曲,然后考慮我的算法方法,邊界條件等等驻债。做完之后記得寫測試判斷需求是否滿足乳规,然后評(píng)價(jià)&優(yōu)化它形葬。
評(píng)價(jià)
在解決一個(gè)問題的時(shí)候,我們會(huì)有個(gè)萬能的方法暮的,就是所有情況都去嘗試笙以。雖然笨但是一定能做出來,代價(jià)就是運(yùn)行次數(shù)規(guī)模青扔,我們把它可以作為一個(gè)時(shí)間維度的評(píng)價(jià)的指標(biāo)源织。于此對(duì)應(yīng)自然就會(huì)有空間維度的評(píng)價(jià)指標(biāo),同樣解決這個(gè)問題微猖,你再干的時(shí)候有很大的副作用空間谈息,需要給你挪很多地方放東西,那么也是一個(gè)評(píng)價(jià)指標(biāo)凛剥。對(duì)時(shí)間性能所謂好的方法解決一個(gè)問題自然就是侠仇,通過每個(gè)問題的特點(diǎn)分析,構(gòu)造我們邏輯去盡可能的命中有用的邏輯犁珠,盡可能減少重復(fù)的無用邏輯逻炊,一旦命中有用邏輯分支,那么else的所有情況就被跳過了犁享。所有的算法我們可以看特點(diǎn)余素,都是分析需求特點(diǎn),然后看看我們有沒有辦法讓他更容易命中有用邏輯炊昆,跳過更多無用的執(zhí)行次數(shù)桨吊。比如樹的優(yōu)先查找算法,這種結(jié)構(gòu)當(dāng)我們一條路檢測到某個(gè)特診后凤巨,下面的路不用走了视乐,直接剪枝,回去走新路敢茁,當(dāng)然對(duì)于走路是一路往下走還是走一路換旁邊的路再往下佑淀,走多少跳出來,都是根據(jù)需求判定哪個(gè)更容易更少走無用路彰檬。我如果更容易命中特征也就更快的能知道這里可以走伸刃,這里不可以走,開啟新的路逢倍。
我希望我表達(dá)的更通俗更好理解奕枝,以實(shí)戰(zhàn)為主。