算法心经.数学的应用.积分的应用
算法心經(jīng):
??? 前幾天,一個好友告訴我,他要寫一本書,叫《編程低手箴言》,我馬上管他要地址去看看,出乎意料,寫得比我想象得好。后來我就自己在想,是不是也應(yīng)該把我平時的一些心得寫出來呢?越越?jīng)_動,既然有了想法,那內(nèi)容選什么呢?既然講給別人聽,就要拿自己拿手的,也就是最有把握的,要不一貼出來被人們拍死就麻煩了。所以,我把題材選為了講算法,名字嘛,就姑且叫《算法心經(jīng)》好了。
?? 寫出點東西,勇氣是必不可少的,像CSDN有個知名作者,寫過一個什么關(guān)于矩陣的新見解,馬上被無數(shù)潛水的高手們拍得半死,其實我一看很多的批評也沒什么道理,即使有道理的也糾纏在名字這種taste differ的范圍內(nèi),不過因為缺少勇氣,他再也不出這個矩陣的續(xù)篇了。我就不同,也許差點水平,但絕不差勇氣。寫這個東東除了給別人看外,也是對自己平時遇到的一些很有意思的問題的總結(jié),如果大家發(fā)現(xiàn)了什么不妥,請馬上幫我指出來。
?? 講算法的資料太多了,大多老一套,貪婪、分枝、限界等,如果想按這個套路學(xué),那大家都去看MIT的算法導(dǎo)論好了,我再寫出來也是copy。既然是原創(chuàng),就要有點新意,下面的內(nèi)容完全按我對各種算法的思路總結(jié)來整理,保證您看著一個與眾不同。另外介于本人的水平有限,所有例子只對我碰上讀過的感覺有用的問題舉例,嫌不夠深入的朋友抱歉。
??? 廢話少說,開始...
一,數(shù)學(xué)的應(yīng)用:
??? 我在抱本數(shù)學(xué)書看時,經(jīng)常有同學(xué)問我,“看這玩意干啥子?“我答曰:”有用“,又問:“有啥用”,我托腮沉思半天,只擠出“反正有用”這種教條結(jié)論。的確,地球人都知道數(shù)學(xué)和計算機關(guān)系曖昧,但具體到哪有交集,又說不清楚,我看可能有兩個原因:1,還不到能理解到數(shù)學(xué)用處的水平。2,使數(shù)學(xué)后,沒有歸納總結(jié)。我想大多數(shù)人屬于后者,為了彌補這點,我把平時用到數(shù)學(xué)的地方總結(jié)出來,讓大家看看數(shù)學(xué)的威力。
積分的應(yīng)用
??? 微積分是高等數(shù)學(xué)的基礎(chǔ),但我們搞程序的平時使到微積分的時候?qū)嵲谏僦稚?#xff0c;反正我大四以前根本沒有用到微積分(編寫什么插值求積分那種程序不算),果真如此嗎???
??? 微積分的威力發(fā)揮在算法分析上,你會算法分析嗎?會的話,肯定會體會到。看看積分的例子:
??? “有一個無序數(shù)列,每次遍歷整個數(shù)列查找一個數(shù),然后刪除之,重復(fù)這個步驟直到數(shù)列為空,問這個算法的效率?”
??? 這個你一眼就看出效率了,遍歷的次數(shù)從1個增加到n個,那么平均是n/2個,一共執(zhí)行n次,所以效率是n*n/2,也就是O(n*n),呵呵,很簡單,愜意的笑。但細想一想,為什么這里能把n除以2呢?是因為n是個線性函數(shù),所以在計算時可以用它的中間值來計算。這種中間值概念的應(yīng)用很普遍,很多算法效率的計算有需要,回憶在quick sort的效率分析里,因為整個數(shù)列里的每個數(shù)與第一個數(shù)(比較數(shù))交換的概率相同,那就是絕對的線性關(guān)系(函數(shù)為常數(shù)),所以才可以用,2*T(k)代替T(k)+T(n-k)。
??? 其實這題也可以用積分來算,效率實際上就是把n在1到n上取積分,也就是n*n/2,和先前的答案一樣,注意這里,積分本身是一個連續(xù)的數(shù)學(xué)概念,這里擴展到離散求積分。
??? 我們把上面的例子改改:
??? “有一個有序數(shù)列,每次用二分查找找到其中一個值,刪除之,重復(fù)這個步驟直到數(shù)列為空,問這個算法的效率?“
??? 想啊想啊,二分效率是log(n),從log(n)降到log(1),那么和先前的一樣,效率是中間值*n,就是log(n)/2*n,也就是O(n*log(n)),我趕緊握著你的手說,“恭喜你,蒙對了!”,最終的答案確實是O(n*log(n)),但絕不是這么出來的,因為log函數(shù)不是線性函數(shù),你絕對不能用中間值代替來進行計算。
??? 哦!那該怎么計算呢?積分來了。上面的算法實際是對log操作從1增加到n,在數(shù)學(xué)上實際是離散的對log函數(shù)做1到n的積分,也就是對log(n)積分。那log(n)的積分怎么算呢?用Udi的《算法導(dǎo)引》的估計法,我們先估計其積分是n*n,我們對n*n求導(dǎo)
??? D(n*n)=2*n>log(n)
??? 我們的估計大了,那么是不是n*log(n)呢?
??? D(n*log(n)) = D(n)*log(n) + n*D(log(n)) = log(n)+ n*1/n=log(n) +1
??? 哇!我們對了,n*log(n)求導(dǎo)就是log(n)再和一個常數(shù)相加,于是可以判斷l(xiāng)og(n)的積分就是和n*log(n)一個等級的,于是,答案出來了,這個算法的效率是n*log(n),這就是積分的威力。
??? 下節(jié)我們來看微分的應(yīng)用...
轉(zhuǎn)自:http://hi.baidu.com/jrckkyy/blog/item/d1c1c00e0ed39ac07acbe16a.html
總結(jié)
以上是生活随笔為你收集整理的算法心经.数学的应用.积分的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法心经:数学的应用:概率的应用
- 下一篇: 数学趣闻