|
不得不說(shuō),有時(shí)候無(wú)知是福,看到一點(diǎn)有趣而深刻的東東,就能感覺(jué)到神奇。越是我們熟悉的東西,往往卻是我們進(jìn)一步理解深刻的障礙,而之所以是障礙是我們并不知道這個(gè)是我們理解問(wèn)題的障礙。困惑中的每一次豁然開(kāi)朗往往是從一點(diǎn)一滴的我們已經(jīng)成為慣性思維中開(kāi)始。越是深刻的原理,往往越是簡(jiǎn)單強(qiáng)大。就像愛(ài)因斯坦打破牛頓給我們?cè)械氖澜缬^一樣。對(duì)于一個(gè)打破常規(guī),讓你重新理解問(wèn)題的最簡(jiǎn)單的方法就是把你整個(gè)思考的前提否定。而帶來(lái)的結(jié)果就是我們看問(wèn)題的角度,層面有了更大的擴(kuò)展。所以,有時(shí)候知道的太多反而不美,做一個(gè)白癡也很幸福。
哎,又無(wú)病呻吟了半天。之所以有上述感想。還得感謝自己的同學(xué)。由于我沒(méi)有看過(guò)MIT的經(jīng)典課程《算法導(dǎo)論》而被鄙視,而且更無(wú)語(yǔ)的是,我的理由是“聽(tīng)不懂,如果有老師的課堂發(fā)音的記錄”,而事實(shí)上。這個(gè)MIT早就提供了,為了照顧想我這樣的聽(tīng)力不好的家伙。好吧,我是個(gè)白癡,不過(guò)就像上面講的,白癡也有白癡的幸福。這個(gè)假期,無(wú)聊的時(shí)候,不僅可以看《愛(ài)情公寓2》也可以屢屢自己的數(shù)學(xué)常識(shí)了。:)
《算法導(dǎo)論》是一名研究算法設(shè)計(jì)的課程。設(shè)計(jì)算法,我們關(guān)心的主要是2個(gè)方面,一個(gè)是性能,另一個(gè)是資源花費(fèi)。當(dāng)然,我們重點(diǎn)的是性能,我們總是希望我們的程序跑的更快。那么學(xué)習(xí)算法到底有什么用呢?這是一個(gè)經(jīng)典的問(wèn)題。Charles Leiserson 是這樣給我們解答的。首先,列舉了一大堆在實(shí)際編程中比性能更重要的東西:可維護(hù)性,模塊化,功能,用戶體驗(yàn)等等。特別是用戶體驗(yàn),那么既然有這么多的東東比算法重要,那么為什么我們還要學(xué)習(xí)算法呢?
- 算法決定了可行還是不可行。
在一些實(shí)時(shí)的情況下,比如機(jī)器人等嵌入式設(shè)備,我們不夠快,那么就沒(méi)有意義,如果我們用了太多的內(nèi)存,同樣不行。所以,算法這個(gè)東東,總是在我們計(jì)算機(jī)領(lǐng)域的最前沿部分,如人工智能,搜索引擎,數(shù)據(jù)挖掘。如果我們是在做10年前就已經(jīng)實(shí)現(xiàn)了的東西,那么性能的確在一些情況下已經(jīng)不重要了。但是,如果想做一些別人沒(méi)有做過(guò)的東西,真正的實(shí)現(xiàn)從無(wú)到有的過(guò)程。那么其中遇到的絕大多數(shù)問(wèn)題都是,數(shù)據(jù)太復(fù)雜了。沒(méi)有能力在有限的資源下找到答案。這也就是為什么叫計(jì)算機(jī)科學(xué),而不是計(jì)算機(jī)工程。(當(dāng)然科學(xué)這個(gè)和名字是無(wú)關(guān)的,比如物理,從來(lái)沒(méi)有那個(gè)學(xué)校叫個(gè)什么物理科學(xué)什么的。:))。不得不說(shuō),MIT的目標(biāo)是為世界培養(yǎng)leader,而我們那破學(xué)校是為了培養(yǎng)farmer(這里并沒(méi)有不敬在里面,而且事實(shí)上,做一個(gè)farmer挺好的,每年坐在家里,收個(gè)房租,年末村里再分個(gè)幾十萬(wàn),比那些城里白領(lǐng)好多了在物質(zhì)上)。其實(shí)也不那么絕對(duì),非要改變世界,只要是之前沒(méi)有做過(guò)的程序,我們?cè)趯?shí)現(xiàn)之前,首先思考的一定是算法。其次,則是對(duì)他不斷的優(yōu)化,完善。
對(duì)絕大多數(shù)的剛剛參加工作的同學(xué),往往不能體會(huì)到整個(gè)產(chǎn)品的創(chuàng)建過(guò)程。參與的僅僅是完善,算法的設(shè)計(jì)或是大體設(shè)計(jì)已經(jīng)完成,所以感覺(jué)不到算法的存在。而匆匆下了學(xué)校白學(xué)的定論。而隨著工作時(shí)間變長(zhǎng),總會(huì)遇到?jīng)]有或是不能直接利用原有設(shè)計(jì)的東東,那么算法也就體現(xiàn)出價(jià)值了。
- 算法是一種描述程序行為的通用語(yǔ)言。
我們可以通過(guò)算法去描述程序的運(yùn)行流程,在任何地方。他不僅能在實(shí)踐中得到體現(xiàn),也能在理論中得到證明。而且能夠得到大家一致的看法。而這是別的永遠(yuǎn)無(wú)法做到的,比如用戶體驗(yàn),每個(gè)人都有自己的想法,我們不可能讓所有人都滿意我們的設(shè)計(jì),而算法卻可以做到,因?yàn)榭炀褪强臁7诺接?jì)算機(jī)上一跑結(jié)果自知。別人無(wú)法擊敗你,即便是再挑剔的對(duì)手,只要你足夠出色。而能夠滿足這樣條件的前提就是,算法是一個(gè)如此一般化,基礎(chǔ)的東西。就像Charles Leiserson 所講,算法就像錢,你可以用錢去買吃的,喝的。而衡量這些花費(fèi)的就是錢的數(shù)目。在計(jì)算機(jī)上,則是,選擇一個(gè)這樣的策略,需要花費(fèi)多少。選擇另一個(gè)策略,需要花費(fèi)多少。而衡量這2個(gè)選擇誰(shuí)的花費(fèi)多呢?是算法。
算法在計(jì)算機(jī)中的地位,就和數(shù)學(xué)在所有理科學(xué)科中的地位一樣。我曾經(jīng)問(wèn)過(guò)我的數(shù)學(xué)老師一個(gè)問(wèn)題,他的回答讓我直到現(xiàn)在還記憶猶新。“老師,數(shù)學(xué)在您眼中是什么呢?”“數(shù)學(xué)是所有理科中是最奇妙的一個(gè)。因?yàn)樗梢元?dú)立于其他任何學(xué)科存在而其他學(xué)科離開(kāi)不了數(shù)學(xué)。”是的。能夠想象物理化學(xué)離開(kāi)數(shù)學(xué)之后是什么樣子么?但是數(shù)學(xué)為什么能夠獨(dú)立存在?是因?yàn)樗麡?gòu)建了一門語(yǔ)言,一門偉大的語(yǔ)言。使用這門語(yǔ)言可以讓知識(shí)在任何領(lǐng)域中環(huán)繞,學(xué)好數(shù)學(xué)就好像有了一張無(wú)限透支的通用支票,可以在任何地方花費(fèi)(黃金?)。作為一個(gè)可以讓這么多地方都通用的原因中最重要的就是,他是超級(jí)穩(wěn)定的。是一個(gè)說(shuō)一不二的世界。一個(gè)公平的世界,絕對(duì)的世界(當(dāng)然,現(xiàn)在數(shù)學(xué)這個(gè)概念也不準(zhǔn)確了,這個(gè)充分體現(xiàn)了哲學(xué)思想,有正必有反啊:P)。他所確定的東西的結(jié)果是肯定的。沒(méi)有歧義,而且不隨時(shí)間變化而流動(dòng)。比如,我們真實(shí)世界中交流的語(yǔ)言,比如“忽悠”,“猥瑣”。等等。很多詞義,隨著時(shí)間的變化而改變了。使得很多年紀(jì)大的人,和我們這年輕人在交流上就產(chǎn)生了隔閡。而我們最熟悉另一個(gè)例子就是文言文,特別是其中的一些扭曲的字。但數(shù)學(xué)這種基礎(chǔ)類學(xué)科是不會(huì)的。至少在一個(gè)可以預(yù)見(jiàn)的范圍是穩(wěn)定的,沒(méi)有地域限制的。所以,數(shù)學(xué)才能站在人類科學(xué)發(fā)展的最前沿,他的每一次前進(jìn)的一小步,都能改變世界。這就是數(shù)學(xué)之美。同樣也是自己能夠讓絕大多數(shù)人接受的最大障礙。由于他改變的太慢,而且枯燥。絕大多數(shù)人無(wú)法深入的理解。當(dāng)用世俗,腐爛,充滿銅臭,功利的眼光看待純凈的數(shù)學(xué)世界,必然發(fā)現(xiàn)數(shù)學(xué)無(wú)用。而且,這的確是事實(shí),因?yàn)榇蟛糠秩耍疾豢赡艹蔀楦淖兪澜绲募一铮ㄟ@里的確不準(zhǔn)確,因?yàn)楦淖兪澜缭掝}太大,修理地球同樣也是改變世界。)。
算法,同樣為我們計(jì)算機(jī)構(gòu)建了一個(gè)純凈的世界。一個(gè)說(shuō)一不二的世界,他所確定的,沒(méi)有能夠反駁的。當(dāng)然,就和學(xué)習(xí)數(shù)學(xué)一樣,我們不是去成為數(shù)學(xué)家,學(xué)習(xí)物理,不是去成為物理學(xué)家,然后去做哪些能夠改變世界的東西。學(xué)習(xí)這些基礎(chǔ)類學(xué)科的重要在于,他提供了一個(gè)讓我們和那些站在人類史上最頂尖的家伙們交流的語(yǔ)言,從我的角度來(lái)看。如果沒(méi)學(xué)好數(shù)學(xué),能夠和牛頓,愛(ài)因斯坦交流么?沒(méi)有學(xué)好算法,能夠和高爺爺交流么?作為一個(gè)普通人,我們只要學(xué)習(xí)到他們身上的一點(diǎn)點(diǎn),也就足夠了。當(dāng)然,這不是對(duì)所有家伙都有效,有些人總是想,和那些老家伙有什么好交流的,給我一個(gè)周杰倫的簽名吧。:)
- 學(xué)習(xí)算法還有一個(gè)原因,是的,就是興趣。這個(gè)傳說(shuō)中最牛X的老師。
喜歡算法,沒(méi)有別的原因,是的。我就是喜歡比別人快速的感覺(jué)。喜歡數(shù)學(xué),是的。因?yàn)榇蟛糠秩藬?shù)學(xué)不好。所以我就喜歡數(shù)學(xué)。迎難而上,哥就是喜歡做別人做不了的東西。是的,雖然聽(tīng)上去很牽強(qiáng),而且比較扭曲。比較符合印象中90后的想法。不知道90后是不是能產(chǎn)生更多的數(shù)學(xué)家呢?
讓我們回到我們的算法上,既然我們這么關(guān)注性能,那么什么是影響性能的因素呢?
對(duì)于一個(gè)計(jì)算機(jī)外行來(lái)說(shuō),首先就是計(jì)算機(jī)硬件本身的運(yùn)算能力。多一個(gè)超級(jí)牛的CPU,超大的內(nèi)存,固態(tài)硬盤。肯定運(yùn)算快。的確,如果你拿一個(gè)超級(jí)計(jì)算機(jī)和地?cái)偵腺I的一個(gè)小的計(jì)算器比運(yùn)算能力。這個(gè)實(shí)在是一個(gè)很顯然的結(jié)果。是的,所以,我們有些情況下,需要思考在相同條件下,到底哪個(gè)算法的性能更高。這比較的是相對(duì)速度。但是我們卻不能忘了這一點(diǎn)。有時(shí),我們想使用一些很一般的計(jì)算機(jī),通過(guò)優(yōu)秀的算法,來(lái)打敗那些擁有更高硬件的那些家伙們,而我們則必須關(guān)心算法性能的絕對(duì)速度。那么我們?cè)撊绾蚊枋鲞@些看似互相矛盾的東西呢?不要忘記,算法可是基礎(chǔ)啊,我們要的是一個(gè)確切的答案。我們?nèi)绾谓o出一個(gè)確切的答案,而這個(gè)答案不管是超級(jí)計(jì)算機(jī),還是普通PC都能夠支持呢?這就是算法中最重要的一個(gè)概念,甚至是一切分析的大前提,一個(gè)可以把這些復(fù)雜的因素都考慮在內(nèi)(或是都不考慮在內(nèi))的東東轉(zhuǎn)換為可以用數(shù)學(xué)分析的對(duì)象。這就是漸進(jìn)分析。
漸進(jìn)分析的基本思想是:
- 忽略硬件結(jié)構(gòu)
- 不使用真實(shí)世界的運(yùn)行時(shí)間,而是關(guān)心運(yùn)行時(shí)間的增長(zhǎng)速度為對(duì)象
漸進(jìn)分析是一個(gè)非常龐大的概念,我們最熟悉的,也是大多數(shù)本科院校教我們的就是Θ,O,Ω等等類似的這些符號(hào)。這里只從Θ開(kāi)始。
對(duì)一個(gè)初學(xué)者,Θ-notation是比較容易接受的。對(duì)一個(gè)多項(xiàng)式,我們只需要?jiǎng)h除掉所有的低次冪項(xiàng),忽略掉常數(shù),系數(shù)這些次要因素。就和Charles Leiserson 所講的。這個(gè)描述,是工程方向的描述,并不是嚴(yán)格的數(shù)學(xué)上的定義。而對(duì)像我這樣的小白來(lái)說(shuō),最大的誤解就是把他當(dāng)成了數(shù)學(xué)上的嚴(yán)格定義而產(chǎn)生了極大的困惑。
這個(gè)是一個(gè)相當(dāng)經(jīng)典的圖,當(dāng)n趨于無(wú)窮大時(shí),Θ(n3)總能干掉Θ(n2)。不管是同樣的硬件設(shè)備,還是不同的硬件設(shè)備。只是在不同的設(shè)備下,不同的算法下,我們有了一個(gè)不同的系數(shù),低次冪項(xiàng),和常數(shù)。但是,我們關(guān)心的是他隨著數(shù)據(jù)輸入長(zhǎng)度的變大而產(chǎn)生的增速。當(dāng)n超過(guò)n0時(shí),任何的次要因素都是浮云了。我們就可以說(shuō)Θ(n3)被Θ(n2)干掉了,即使Θ(n3)的硬件要比Θ(n2)好很多,在一開(kāi)始的時(shí)候效率有多高。
這是一個(gè)偉大,cool的概念。是的,他完美的既滿足了我們追求的絕對(duì)速度,也能滿足我們追求的相對(duì)速度。可以說(shuō),這給了我們繼續(xù)學(xué)習(xí)算法的動(dòng)力。但是,事實(shí)上,在實(shí)際開(kāi)發(fā)中,我們有時(shí)候卻使用那些在學(xué)校中認(rèn)為是效率低的算法。難道這個(gè)理論錯(cuò)了?當(dāng)然不是,錯(cuò)的是我們,我們忽略了一個(gè)很大的前提,n0。在我們多數(shù)開(kāi)發(fā)過(guò)程中,很少接觸那些海量數(shù)據(jù)的運(yùn)算。我們的運(yùn)算多數(shù)是在一個(gè)較少的數(shù)據(jù)上下浮動(dòng),這個(gè)也可以說(shuō)我們的硬件,資金,產(chǎn)品,根本不需要我們整那么大的數(shù)據(jù)。也就是n0,我們根本達(dá)不到。事實(shí)上,只要是有腦子的,看到這個(gè)圖,在小于n0的前提下,都會(huì)做成正確的判斷。但對(duì)于剛剛步入IT的廣大學(xué)生,卻總是犯下屁股決定腦袋這樣愚蠢的選擇。而這其實(shí),就是做科學(xué)和做工程師的最大區(qū)別。理論和實(shí)踐相互掰手腕的結(jié)果。
這幾天,挖老趙的“墳”,找出了這么一篇。寫程序時(shí)該追求什么,什么是次要的?里面有一段十分搞笑的代碼,之所以這樣說(shuō),是因?yàn)槲易约阂矊戇^(guò)這樣的代碼。想想真是dt啊。回想事發(fā)現(xiàn)場(chǎng),我記得是我看了個(gè)什么類似《面試寶典》東東,有一些題考察交換元素,事實(shí)上,你可以找到一大堆的,而且是更精妙的去交換2個(gè)元素。看到之后,如獲至寶。只要是2個(gè)元素要換位置,就用。站在做科學(xué)的角度上看,這無(wú)可厚非。但是如果站在工程的角度來(lái)看。這就是明顯的畫蛇添足。往往花費(fèi)80%的精力在提高%20的性能上,而不是去花費(fèi)20%的精力提高80%的性能。這同樣是剛剛步入IT的廣大同學(xué)的問(wèn)題。做科學(xué)需要嚴(yán)謹(jǐn),但是在工程方面,考慮的事情非常復(fù)雜,多。我們必須要關(guān)注在核心,關(guān)鍵的部分。這樣才能在有限的資源下,最大的做出東東來(lái)。實(shí)踐中,沒(méi)有任何項(xiàng)目的資源是足夠的。MS,Google都會(huì)有資源不足的時(shí)候。我們需要學(xué)會(huì)抓住重點(diǎn)。當(dāng)然這里并沒(méi)有鄙視這些面試問(wèn)題,事實(shí)上,這些問(wèn)題的背后往往是考察數(shù)學(xué)思維的基本功,而不是鼓勵(lì)大家這么做。就像那個(gè)經(jīng)典的問(wèn)題,12個(gè)小球一架天平。沒(méi)有仔細(xì),嚴(yán)謹(jǐn)?shù)乃伎迹軌蛳氲竭@個(gè)東東能和排序問(wèn)題扯上勾么?神啊,萬(wàn)惡的功利,給完美的數(shù)學(xué)模型批了一層邪惡的外套,使我們?cè)谧非蟊举|(zhì)的過(guò)程中迷失。
有關(guān)n0的問(wèn)題,不僅在算法設(shè)計(jì)上,也出現(xiàn)在我們的設(shè)計(jì)模式之中。《設(shè)計(jì)模式》這本神書,我是沒(méi)看過(guò),也不敢看。但也隱隱感覺(jué)到類似“設(shè)計(jì)過(guò)度”的言論。這同樣都是在理論和實(shí)踐結(jié)合上出了問(wèn)題。當(dāng)然,不少理論支持者,肯定會(huì)說(shuō),那是因?yàn)槟銢](méi)做過(guò)那么大的項(xiàng)目。但事實(shí)卻是,不管設(shè)計(jì)多么復(fù)雜的,還是多么簡(jiǎn)單的,實(shí)踐和理論永遠(yuǎn)不可能都得到滿足。Windows操作系統(tǒng)可以說(shuō)是一個(gè)我們可見(jiàn)的最大的項(xiàng)目之一了。但是Windows也并不是一個(gè)微內(nèi)核,在內(nèi)核中也綁定了非常多的“多余”的部分。從理論上看,那無(wú)疑會(huì)降低系統(tǒng)穩(wěn)定性,提高維護(hù)難度。但是我們卻不能不說(shuō)Windows是最成功的一套軟件之一(這個(gè)之一甚至都可以去掉)。
當(dāng)然,要想在做學(xué)問(wèn)和實(shí)踐找到平衡點(diǎn)。這個(gè)無(wú)疑是極大的挑戰(zhàn)。只是分析理論,而不實(shí)踐,那么永遠(yuǎn)不可能成為一個(gè)出色的工程師。除非你的目標(biāo)是成為理論科學(xué)家。反過(guò)來(lái),如果不理論而只是實(shí)踐,不同的是,這個(gè)是可以成為一個(gè)出色的工程師。所以,這里有一句經(jīng)典的話。
If you want to be a good programmer, you just program ever day for two years, you will be an excellent programmer. If you want to be a world-class programmer, you can program every day for ten years, or you can program every day for two years and take an algorithms class.
既然算法是如此的重要,那么我們?cè)撊绾螌W(xué)呢?其實(shí),這是一個(gè)很糾結(jié)的問(wèn)題。甚至是一個(gè)雞生蛋,蛋生雞的問(wèn)題。不學(xué)算法,你不會(huì)了解他,也不會(huì)認(rèn)識(shí)到算法重要;認(rèn)為算法不重要,那么也就不會(huì)下功夫去學(xué)。這就又回到一開(kāi)始的那個(gè)unknown unknown上了。所以,如果準(zhǔn)備學(xué)習(xí)算法,也就意味著選擇了一條坎坷的路。一開(kāi)始特別迷茫,但是沒(méi)有別的選擇。唯有堅(jiān)持,放下浮躁,功利的心態(tài),沉浸在數(shù)學(xué)的世界中才能體會(huì)到數(shù)學(xué)的價(jià)值,數(shù)學(xué)的樂(lè)趣。也只有這樣,才能堅(jiān)持到最后。
當(dāng)然,能做到這一點(diǎn)的,敢說(shuō)體會(huì)到數(shù)學(xué)之美的家伙,全世界也沒(méi)有幾個(gè)人。那么,作為一個(gè)普通人,我們?cè)趺床拍茏畲蟮娜ヌ岣咦约海玫恼莆諏?shí)踐和科學(xué)的平衡點(diǎn)呢?這個(gè)問(wèn)題,我自己也沒(méi)有答案。因?yàn)槲壹葲](méi)經(jīng)驗(yàn)又沒(méi)理論。這里只是扯下我自己的理解,可能很偏激。
首先應(yīng)該研究下劉未鵬的很多博客內(nèi)容,特別是錘子和釘子。對(duì)我這樣的新手來(lái)說(shuō),武器真的太少了。所以當(dāng)撿到一個(gè)武器往往過(guò)于興奮而忽視了這個(gè)武器的使用前提,往往殺雞用牛刀,而且還達(dá)不到積極的效果。就是因?yàn)槲覀兡玫藉N子之后,所有東西看上去都像釘子。所以,我們唯有擺正心態(tài),深入了解擁有的武器,并增加更多的武器,見(jiàn)更多的市面,才能坐懷不亂,達(dá)到手中有錘,心中無(wú)錘的最終境界。
一個(gè)稍微實(shí)際的例子。對(duì)像我這樣的菜鳥來(lái)講,大部分都會(huì)遇到這樣一個(gè)問(wèn)題。而且困惑很久很久。“堆排序?yàn)槭裁幢瓤焖倥判蛟诖蠖鄶?shù)時(shí)要慢呢?”事實(shí)上,造成這個(gè)問(wèn)題的主要原因(對(duì)我)就是,沒(méi)有理解明白Θ-notation。那些被忽略掉的次要因素,當(dāng)然還有更重要的是數(shù)學(xué)上對(duì)概率的薄弱理解。然后我們會(huì)再映射出一大堆的數(shù)學(xué)基礎(chǔ)知識(shí),然后大部分人死在沙灘上(真的,這是我從小以來(lái)最大的遺憾,就是沒(méi)有學(xué)好概率,而造成這個(gè)的原因居然是,這些題目初學(xué)時(shí)往往是用日常用語(yǔ)出題,而由于本人語(yǔ)文太差,總不能理解清楚題意,而對(duì)這類題目產(chǎn)生了極大的抵觸,可見(jiàn)小朋友們千萬(wàn)不要偏科:P)。從科學(xué)的角度去,完全可以證明這個(gè)問(wèn)題,但是付出的代價(jià)就是沒(méi)有碩士以上的數(shù)學(xué)能力的玩家,沒(méi)有機(jī)會(huì)理解到那個(gè)層次。那么,其實(shí)我們可以從另一個(gè)角度看,直接放到計(jì)算機(jī)上跑一下就可以了么。是的,我不是科學(xué)家,我只需要知道結(jié)果就OK了。是啊,好在我們處在一個(gè)和諧的世界。讓我們從這個(gè)龐然大物中得以解脫,所以,有時(shí),我們需要根據(jù)自身情況,放棄一些東西,特別是那些比較能夠通過(guò)實(shí)驗(yàn)來(lái)證明的東西。
好吧,總不能啥也放棄吧,都放棄了那到底也簡(jiǎn)單了。這里,我只能說(shuō),我推薦SGI STL。在我看來(lái),這是一個(gè)結(jié)合了設(shè)計(jì)模式,理論算法與實(shí)踐最好的一個(gè)實(shí)例。他不僅是開(kāi)源的,代碼量也不多,命名也算規(guī)范,而且還有一本侯捷大師的著作來(lái)詮釋,幫助我們理解,而且還能幫助我們具體實(shí)踐過(guò)程中規(guī)避一些錯(cuò)誤。我們每一個(gè)在學(xué)校學(xué)習(xí)的算法,我們都可以在這里找到答案(至少可以用來(lái)做作業(yè)拿高分對(duì)某些特別的女生),而且都會(huì)比一般大學(xué)講的深刻,事實(shí)上,我認(rèn)為,大學(xué)現(xiàn)在的教育為什么覺(jué)得無(wú)用,不是太難太理論,而是教的太簡(jiǎn)單了,簡(jiǎn)單到已經(jīng)沒(méi)有用的地步了,從而根本沒(méi)有實(shí)際意義。(大學(xué)聯(lián)合培訓(xùn)機(jī)構(gòu),是我所見(jiàn)過(guò)的,比大學(xué)擴(kuò)招還要搞笑的事情)比如快速排序,SGI STL做了非常多的優(yōu)化來(lái)保證無(wú)論在什么時(shí)候,都不會(huì)退化到n2,在分的過(guò)程總是分不好時(shí),采用堆排序。在快速排序到做最后幾步,為了減少開(kāi)銷而采用插入排序去做哪些馬上就要排好序的部分。而這些策略,并不是憑空想象,都可以在高爺爺?shù)闹髦姓业嚼碚撟C明,以及網(wǎng)上的各種論文,前提是你的數(shù)學(xué)功底足夠(當(dāng)然這里實(shí)踐在前還是理論在前這個(gè)實(shí)在是沒(méi)有討論的意義)。所以,理論不是沒(méi)有用,只是自己學(xué)的太膚淺。實(shí)踐也不是沒(méi)有用,只是自己沒(méi)有考慮那么多的情況,想的太簡(jiǎn)單而已。
當(dāng)然,這個(gè)可能又會(huì)引起另一個(gè)龐大的問(wèn)題,“不要重復(fù)制作輪子”,不過(guò)這個(gè)已經(jīng)大大超出這篇文章的范圍了。我自己的看法是,STL是為了實(shí)現(xiàn)最基本的最通用的東東的,而實(shí)際過(guò)程中,我們往往有自己的特殊性。而這些特殊性是STL不可能設(shè)計(jì)時(shí)都給我們考慮周全的。也就是我們很可能需要擴(kuò)展,重寫部分以適合我們的需要。當(dāng)然,現(xiàn)在離這些目標(biāo)還很遠(yuǎn)很遠(yuǎn)很遠(yuǎn)。
【推薦閱讀】
it知識(shí)庫(kù):算法學(xué)習(xí)二三事,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。