從上周開始,《吳軍的谷歌方法論》中的文章之剧,和計算機知識相關(guān)性更強了螃概。在閱讀老師精彩文章之余,也需多做一些自己的反思和總結(jié)唧龄,希望能跟上老師的腳步,對計算機思維有較多的認識奸远,讓自己更好地適應(yīng)智能時代既棺。
一、計算機算法的比較
對于計算機的算法懒叛,吳軍老師是這樣定義的:
科學(xué)家們在翻譯現(xiàn)實世界的需求和計算機虛擬過程時丸冕,就提煉出一些高效的、不斷被驗證過的標準流程薛窥,這些流程就是我們所說的計算機算法胖烛。
計算機算法構(gòu)成了計算機科學(xué)的基礎(chǔ)。在算法上一個很小的差別诅迷,會導(dǎo)致計算機執(zhí)行效率上千萬倍的差距佩番。受此啟發(fā),吳軍老師常說竟贯,人和人水平的差別是數(shù)量級的答捕。因為不同的做事方法,產(chǎn)生的效果之間會存在非常巨大的差異屑那。
這里老師提出了A拱镐、B兩種算法的比較:
場景一:使用1萬個數(shù)據(jù)進行測試,算法A的運行時間是1毫秒持际,算法B的運行時間是10毫秒沃琅。
場景二:使用100萬個數(shù)據(jù)測試,算法A運行10000毫秒蜘欲,算法B運行6000毫秒益眉。
看似A在數(shù)據(jù)少時有優(yōu)勢,B在數(shù)據(jù)大時有優(yōu)勢,無法比較郭脂,但算法分析之父高德納確定了算法比較的標準年碘。
在比較算法快慢時,需要假定數(shù)據(jù)量會達到近乎無窮大展鸡。然后屿衅,將影響算法快慢的因素分為兩類:一類不隨數(shù)據(jù)變化,另一類是隨著數(shù)據(jù)變化的莹弊。
在比較兩種算法的時候涤久,只關(guān)注第二類影響因素,也就是隨著數(shù)據(jù)變化的影響因素忍弛。如果兩種算法在量級上是相當响迂,那么就認為兩種算法是一樣好的,不必計較三五倍的差別细疚。
高德納之所以能提出這樣的理論蔗彤,在于他能將問題理想化,提出次要因素惠昔,考慮最重要的因素幕与。這樣的思想對于我們很有啟發(fā)意義。
記得在物理化學(xué)中镇防,科學(xué)家為了簡化問題,會將實際氣體簡化為理想氣體潮饱。就是假定氣體分子本身的體積来氧,氣體分子之間的受力和氣體分子碰撞的能量損失,都可以忽略不計香拉±惭铮基于理想氣體的模型來研究問題,可以極大地簡化計算凫碌,只考慮壓強和溫度對于空氣系統(tǒng)的影響扑毡。這樣簡化的過程,是一個忽略次要因素盛险,側(cè)重研究重要因素的過程瞄摊。當然,在一些特定的空氣系統(tǒng)中苦掘,科學(xué)家會對理想氣體方程進行修正换帜,以便更好地模擬實際氣體,以便降低誤差鹤啡,得到更準確的結(jié)果惯驼。
這樣的思維對于我的啟發(fā)是,面對生活中的問題,可以抽象出影響的因素祟牲,找到最主要的矛盾隙畜,用最主要的精力把主要矛盾解決了,再去逐個解決次要的矛盾说贝。
二议惰、從排序算法到提高效率的本質(zhì)
在生活中,我們會面對很多具體的排序問題狂丝,比如一個年級的學(xué)生按照成績排序换淆,電商按照商品的交易量排序等。將這些現(xiàn)實世界的問題几颜,變成計算機可運行的程序倍试,中間的橋梁就是排序算法。
文中老師介紹了最基本的插入法和冒泡法蛋哭,兩種算法出于同一個量級县习,是一樣好的。那么更好的算法是怎樣的呢谆趾?
這就要提高計算機的效率躁愿,而提高計算機效率的方法,就是讓計算機少做事情沪蓬。這里老師介紹了一種叫作歸并排序的方法彤钟。當處理的數(shù)據(jù)為1萬時,冒泡法和插入法的復(fù)雜度是1億跷叉,而歸并算法的復(fù)雜度是13萬逸雹,可見歸并算法比前兩者要好處很多。這也就是為什么云挟,水平較差的程序員會無端浪費成千上萬倍的計算資源了梆砸。
歸并算法的效率之所以這么高,是因為它減去了很多不必要的比較园欣。這里老師也再次說明了自己的做事方法帖世,就是少做事情,把每一件經(jīng)手的事情都做到很好沸枯。
效率=產(chǎn)出/所做的事情日矫。人的產(chǎn)出是很難提高的,但是所做的事情是可以減少的辉饱。
三搬男、快速排序:要想提高效率就要少做事情
在這里老師介紹了目前最好的排序算法:快速排序法。該方法的基本思路如下:
首先彭沼,對于一大堆無序的數(shù)字缔逛,從中隨機挑選一個,比如是53,這個被隨機選上的數(shù)字被稱為樞值褐奴。這個樞值可以將所有數(shù)值分為兩組按脚,一組大于53,一組小于53敦冬。
然后辅搬,從上面得到的兩堆數(shù)字,分別采用第一步的方法各自再找一個樞值脖旱。這樣一層層找下去堪遂,很快就把所有的數(shù)字排好了。
快速排序在歸并排序的基礎(chǔ)上萌庆,進一步少做了事情溶褪。
那么是否有比快速排序更優(yōu)的排序方法呢?答案是否定的践险,關(guān)于這一點已經(jīng)在數(shù)學(xué)上證明過了猿妈。這就是我們做事情的邊界。如果一個人不去認證讀數(shù)學(xué)證明巍虫,而是一心要去研究更好的排序算法彭则,就是浪費自己的時間。我們一定要在邊界內(nèi)做事占遥。
關(guān)于快速排序俯抖,古小千同學(xué)的留言非常精彩。我們經(jīng)常在做計劃排優(yōu)先順序上花了大量的時間瓦胎,小千同學(xué)給出了一個不錯的方法:
首先找到一個顯而易見的待辦事項(樞值)蚌成,接著綜合考慮急迫性和重要性,分成兩撥凛捏;再將兩撥事情找到樞紐,就把所有的工作芹缔,依照平分分成四份了坯癣。
再接下來,我會快速檢查后兩部分的事情最欠,將不必要的事情減法刪除示罗、將重要但不急迫的事先預(yù)定計劃。然后專注完成前兩部分的事芝硬,透過排序和減法蚜点,一天要完成的事就只剩約一半。樞紐這個節(jié)點拌阴,幫我們梳理參考點绍绘,而事情一件件單看,很難取舍;但有了參考陪拘,一比較就能掂量差別厂镇,勇敢做減法了!
對于快速排序的實際應(yīng)用左刽,我是這樣理解的捺信。我們要做的事情大體可以分為工作方面和生活方面。由于我們一段時間只能做一件事情欠痴,那就要從工作中找到最重要的事情迄靠,生活中找到最重要的事情,比較兩件事情的優(yōu)先級喇辽。
就工作方面而言掌挚,我們又有很多不同的選項,可以深入當前的工作茵臭,可以準備換工作疫诽,也可以思考創(chuàng)業(yè)。因為我現(xiàn)在的公司就是老師說的底層員工和總經(jīng)理差不多的單位旦委,所以最近在考慮換工作(其實考慮很久了…)奇徒。過年時候有朋友聯(lián)系我,希望我和他一起做B2B平臺方面的創(chuàng)業(yè)項目缨硝。如果平臺發(fā)展順利摩钙,那么后期的回報是非常大的。但我綜合考慮了一下查辩,目前自己的能力還不足以勝任胖笛。自己本身的基線還不夠把這件事情做好。那么我現(xiàn)在的優(yōu)先順序就是:換工作>本職工作>創(chuàng)業(yè)宜岛。
然后在每個小的方面长踊,再進行排序,優(yōu)選出最重要的事情萍倡。老師說想要提高效率就要少做事身弊,對于最終要選擇哪些事情來做,快速排序法是一個不錯的方法列敲,幫助我們確定優(yōu)先順序阱佛。
四、計算機科學(xué)和計算機工程的差別
這里老師分析了計算機科學(xué)和計算機工程的三個差別:
1.方向和道路之分別
前者指明方向戴而,后者鋪就道路凑术。
2.關(guān)注的事情不同
前者關(guān)注的是算法在量級上跨越式的提升,不會過分考慮處理器時間所意、計算機內(nèi)存等限制淮逊;而后者則要考慮很多具體的問題催首,即便能節(jié)省20%的時間也是有意義的。
3.和錢的距離不同
前者離錢較遠壮莹,更多純粹研究翅帜,后者離錢較近,更加務(wù)實命满。
通過分析兩者的區(qū)別和聯(lián)系涝滴,我認識到,純粹的研究有助于技術(shù)產(chǎn)生量級上的提升胶台,如果喜歡做研究歼疮,就不要羨慕做工程的人離錢更近,專心做出一些讓世界有所不同的東西诈唬。如果喜歡做工程韩脏,首先要仔細查閱資料,找到現(xiàn)有研究成果中最先進的方法铸磅,在此基礎(chǔ)上做微調(diào)赡矢。