數(shù)據(jù)結(jié)構(gòu)中,,數(shù)組和鏈表好多人都沒(méi)玩轉(zhuǎn),棧和二叉樹(shù)就更不用多說(shuō)了,。 我說(shuō)的玩轉(zhuǎn)不是你懂了,,會(huì)做兩道題,,你就玩轉(zhuǎn)了。 我之前簡(jiǎn)單了解過(guò)數(shù)據(jù)結(jié)構(gòu),,發(fā)現(xiàn)了部分和算法的關(guān)系,。(我不敢講熟悉,因?yàn)楦呤痔嗔耍?/span> 舉個(gè)我捉摸的一個(gè)我認(rèn)為很經(jīng)典的例子:棧,。棧的特性大家都知道,,但是算法中的棧你會(huì)用多少? ( 棧的特性,,先進(jìn)后出,。) 計(jì)算機(jī)調(diào)用編程語(yǔ)言的函數(shù),棧式調(diào)用,。當(dāng)設(shè)計(jì)一個(gè)遞歸程序時(shí),,底層是不斷的在壓棧的,那就可以把你現(xiàn)在這個(gè)遞歸函數(shù)抽象一下,。試想,,棧能解決的事情,是不是你的這個(gè)遞歸函數(shù)就能實(shí)現(xiàn),?是不是這個(gè)原理,?那你的代碼是不是就是和數(shù)據(jù)結(jié)構(gòu)聯(lián)系起來(lái)了?(那你處理問(wèn)題是不是可以先想到棧,?然后只要拿棧設(shè)計(jì)好了是不是順其自然遞歸函數(shù)就實(shí)現(xiàn)了,?《一般情況》) 或者你可能還是不大理解,沒(méi)關(guān)系,,我主要是提起你對(duì)數(shù)據(jù)結(jié)構(gòu)以及算法的興趣,,我還有其他例子供你吸收。 第二個(gè)例子:這個(gè)例子可能更深?yuàn)W一些,,不過(guò)你有數(shù)據(jù)結(jié)構(gòu)和算法基礎(chǔ)的人還是好理解的,。 還記得回溯算法吧?大家如果簡(jiǎn)單的實(shí)現(xiàn),,寫(xiě)一個(gè)遞歸,,按照其思想實(shí)現(xiàn)了就好了。 那好,,單從這塊出發(fā),,為啥回溯算法用遞歸輕而易舉就實(shí)現(xiàn)了? 答案就是:回溯算法會(huì)分析到各種情況,,當(dāng)這一種走不通時(shí)他會(huì)卡住,,往前回,走另一條路,,直到走完,。那這樣的路線和什么類似了,?和二叉樹(shù)遍歷類似,深度優(yōu)先搜索時(shí)候,,我們其實(shí)就是由頭結(jié)點(diǎn)一步一步壓棧遍歷每個(gè)葉子結(jié)點(diǎn)(每個(gè)葉子結(jié)點(diǎn)代表一種情況),,那也就是說(shuō),這塊本質(zhì)其實(shí)是用棧對(duì)二叉樹(shù)的遍歷,,對(duì)吧?回溯法不過(guò)就是將數(shù)據(jù)結(jié)構(gòu)某些集合體結(jié)合起來(lái)運(yùn)用了,,對(duì)不? 第三個(gè)例子:動(dòng)態(tài)規(guī)劃,。 動(dòng)態(tài)規(guī)劃分很多種的問(wèn)題,,我只講一個(gè)簡(jiǎn)單版本的,會(huì)涉及到 樹(shù)-二叉樹(shù)-棧-隊(duì)列 (其他動(dòng)態(tài)規(guī)劃問(wèn)題會(huì)涉及到圖等的結(jié)合) 學(xué)算法,,一定是從迭代到遞歸再到迭代!(如果有錯(cuò)的地方,,歡迎指正) |
|