數(shù)學(xué)技術(shù)之算法概論篇(4)
②統(tǒng)治世界的十大算法
軟件正在統(tǒng)治世界,而軟件的核心是算法;互聯(lián)網(wǎng)即將統(tǒng)治世界,其管理、使用的核心也是算法;算法統(tǒng)治著軟件和互聯(lián)網(wǎng),所以說(shuō)“算法統(tǒng)治世界”這句話應(yīng)是有一定道理的。
算法決定了你用Google搜索的結(jié)果,算法決定了新浪微博向你展示的話題,算法決定了Netflix向你推薦的電影,算法決定了你QQ對(duì)話窗彈出的橫幅廣告等等,這些都意味著“算法在統(tǒng)治世界”。我們花費(fèi)了大量時(shí)間、巨大的投資來(lái)研究新算法,調(diào)整、改善舊算法,尋找更好的算法以便集成到應(yīng)用中去,但是有些現(xiàn)成的算法卻罕有人知曉,最后卻是“眾里尋她千百度,那人卻在燈火闌珊處”——往往答案就在眼前,但很多別人已經(jīng)研究多年的算法自己卻從未聽(tīng)說(shuō)過(guò)。這里,從千千萬(wàn)萬(wàn)算法中,整理出統(tǒng)治世界的十大算法的小型列表,排名不分先后,供參考。
1. 歸并排序,快速排序和堆排序
哪個(gè)排序算法最好?這取決于需求,也是為什么要將歸并排序、快速排序和堆排序算法這三個(gè)使用頻率較高的排序算法置于一處的原因。你可能比較偏愛(ài)其中的一個(gè),但它們都是同等重要的。
歸并排序算法是目前為止我們擁有的最重要的算法之一。它是一種基于比較的排序算法,使用分治法解決那些原本復(fù)雜度為O(N
2)的問(wèn)題。歸并排序是由數(shù)學(xué)家John von Neumann于1945年提出的。
快速排序是解決排序問(wèn)題的另一種途徑,它使用就地分解算法,同時(shí)它也是一種分治算法。這個(gè)算法的問(wèn)題在于它是不穩(wěn)定的排序算法,但它在基于內(nèi)存的數(shù)組排序上確實(shí)非常高效。
最后,堆排序算法使用一個(gè)優(yōu)先隊(duì)列降低數(shù)據(jù)的查找時(shí)間,它也是一種就地排序算法,同樣也是不穩(wěn)定的排序算法。
相較于曾經(jīng)使用的其他排序算法(如冒泡排序),上述算法帶來(lái)了顯著的改進(jìn)。事實(shí)上,多虧了它們,今天我們才有了數(shù)據(jù)挖掘、人工智能、鏈接分析,以及世界上大部分的計(jì)算機(jī)工具,也包括網(wǎng)絡(luò)在內(nèi)。
2. 傅立葉變換與快速傅立葉變換
整個(gè)數(shù)字世界都在使用這一簡(jiǎn)單而又強(qiáng)大的算法,將信號(hào)從頻域轉(zhuǎn)換為時(shí)域,反之亦然。互聯(lián)網(wǎng)、你的WIFI、智能手機(jī)、電話、計(jì)算機(jī)、路由器、衛(wèi)星,幾乎所有內(nèi)置計(jì)算機(jī)的東西都會(huì)以各種方式使用這些算法實(shí)現(xiàn)各自的功能。
3. Dijkstra算法
毫無(wú)不夸張地說(shuō),如果沒(méi)有這個(gè)算法,當(dāng)今互聯(lián)網(wǎng)將無(wú)法有效工作。這是一種圖搜索算法,它被廣泛應(yīng)用在能夠建模為圖的問(wèn)題中,用以找出兩個(gè)節(jié)點(diǎn)之間的最短路徑。
目前,即便我們已經(jīng)擁有了解決最短路徑問(wèn)題的更好方法,Dijkstra算法依然在那些重視穩(wěn)定性的系統(tǒng)中得到應(yīng)用。
4. RSA算法
如果沒(méi)有信息加密和網(wǎng)絡(luò)安全,互聯(lián)網(wǎng)不會(huì)像現(xiàn)在那么重要。在信息加密領(lǐng)域,有一個(gè)算法始終是世界上最重要的算法之一,它就是RSA算法。這個(gè)算法是由RSA公司的創(chuàng)始人建立,它使信息加密惠及千家萬(wàn)戶,奠定了當(dāng)今信息加密的運(yùn)作基礎(chǔ)。RSA算法用來(lái)解決一個(gè)簡(jiǎn)單而又復(fù)雜的問(wèn)題:怎樣在不同平臺(tái)和終端用戶之間共享公鑰,繼而實(shí)現(xiàn)信息加密。其實(shí),這個(gè)問(wèn)題也沒(méi)完全解決,還需要做更多工作。
5. 安全哈希算法
準(zhǔn)確地說(shuō),它不能稱之為算法,它是美國(guó)國(guó)家標(biāo)準(zhǔn)暨技術(shù)學(xué)會(huì)定義的加密散列函數(shù)族中的一員,但是這族算法對(duì)整個(gè)世界的運(yùn)作至關(guān)重要。從你的應(yīng)用商店,你的郵件,你的殺毒軟件,到你的瀏覽器等等,所有這些都在使用安全哈希算法,它能判斷你是否下載了你想要的東西,也能判斷你是否是中間人攻擊或網(wǎng)絡(luò)釣魚攻擊的受害者。
6. 整數(shù)因式分解
這是在計(jì)算機(jī)領(lǐng)域被大量使用的數(shù)學(xué)算法,沒(méi)有這個(gè)算法,信息加密會(huì)更不安全。該算法定義了一系列步驟,得到將一合數(shù)分解為更小因子的質(zhì)數(shù)分解式。這被認(rèn)為是一種FNP問(wèn)題,它是NP分類問(wèn)題的延伸,極其難以解決。
許多加密協(xié)議(如RSA算法)都基于這樣一個(gè)原理:對(duì)大的合數(shù)作因式分解是非常困難的。如果一個(gè)算法能夠快速地對(duì)任意整數(shù)進(jìn)行因式分解,RSA的公鑰加密體系就會(huì)失去其安全性。
量子計(jì)算的誕生使我們能夠更容易地解決這類問(wèn)題,同時(shí)它也打開(kāi)了一個(gè)全新的領(lǐng)域,使得我們能夠利用量子世界中的特性來(lái)保證系統(tǒng)安全。
7. 鏈接分析
在互聯(lián)網(wǎng)時(shí)代,分析不同實(shí)體間的關(guān)系是相當(dāng)重要的。從搜索引擎,社交網(wǎng)絡(luò),到營(yíng)銷分析工具,每個(gè)人都在不停尋找互聯(lián)網(wǎng)的真正結(jié)構(gòu)。
鏈接分析背后的理念非常簡(jiǎn)單,以矩陣形式描繪出一張圖,將問(wèn)題轉(zhuǎn)換為特征值問(wèn)題。特征值是一種很好的渠道,它有助于展現(xiàn)圖的結(jié)構(gòu)以及每個(gè)節(jié)點(diǎn)的相對(duì)重要性。該算法是由Gabriel Pinski和Francis Narin于1976年建立的。
誰(shuí)在使用這個(gè)算法?Google的Page Rank算法,F(xiàn)acebook向你展示的新聞提要(這就是為什么Facebook的新聞提要不是算法,只是使用算法的結(jié)果而已),Google 和Facebook的推薦,LinkedIn的工作和聯(lián)系人推薦,Netflix和Hulu的電影,YouTuBe的視頻,等等。雖然每個(gè)都有不同的目標(biāo)和參數(shù),但它們背后的數(shù)學(xué)理念是相同的。
8. 比例積分微分算法
你是否曾經(jīng)用過(guò)飛機(jī)、汽車、衛(wèi)星服務(wù)或手機(jī)網(wǎng)絡(luò)?你是否曾經(jīng)在工廠工作或是看見(jiàn)過(guò)機(jī)器人?如果回答是肯定的,那么你應(yīng)該已經(jīng)見(jiàn)識(shí)過(guò)這個(gè)算法了。
大體上,這個(gè)算法使用一種控制回路反饋機(jī)制,將期望輸出信號(hào)和實(shí)際輸出信號(hào)之間的錯(cuò)誤最小化。無(wú)論何處,只要你需要進(jìn)行信號(hào)處理,或者你需要一套電子系統(tǒng),用來(lái)自動(dòng)化控制機(jī)械、液壓或熱力系統(tǒng),這個(gè)算法都會(huì)有用武之地??梢赃@樣說(shuō),如果沒(méi)有這個(gè)算法,現(xiàn)代文明將不復(fù)存在。
9. 數(shù)據(jù)壓縮算法
要判斷哪種數(shù)據(jù)壓縮算法最為重要是很困難的,因?yàn)樗Q于不同的應(yīng)用環(huán)境。它們可以應(yīng)用在zip和mp3上,也可以應(yīng)用在JPEG和MPEG-2上。但眾所周知,在所有結(jié)構(gòu)中這些算法都極其重要。
除了顯而易見(jiàn)的zip文件,在哪我們能夠找到這些算法?在電子游戲、視頻、音樂(lè)、數(shù)據(jù)存儲(chǔ)、云計(jì)算、數(shù)據(jù)庫(kù)等等地方都能找到這些算法??梢哉f(shuō),數(shù)據(jù)壓縮算法處處可見(jiàn),它們使系統(tǒng)成本更低、效率更高。
10. 隨機(jī)數(shù)生成
現(xiàn)在我們還沒(méi)有一個(gè)“真正的”隨機(jī)數(shù)生成器,但我們已經(jīng)有了一些偽隨機(jī)數(shù)生成器,這就夠用了。隨機(jī)數(shù)生成器的用途非常廣泛,從互聯(lián)聯(lián)絡(luò)、數(shù)據(jù)加密、安全哈希算法、電子游戲、人工智能、優(yōu)化分析,到問(wèn)題的初始條件、金融等等,都有它們的身影。
最后再?gòu)?qiáng)調(diào)一下,上面這個(gè)列表僅供參考,它并不完整。因?yàn)樵跈C(jī)器學(xué)習(xí)、矩陣乘法、分類化等領(lǐng)域也有一些算法,它們對(duì)我們的世界同樣重要,但在這里還沒(méi)有提到。
③數(shù)學(xué)建模競(jìng)賽中常用的十類算法
諸多國(guó)內(nèi)參賽帶隊(duì)老師對(duì)我國(guó)多年數(shù)學(xué)建模賽賽題目進(jìn)行研究分析之后,總結(jié)出如下建模競(jìng)賽中常用的十大類算法,現(xiàn)列出供對(duì)此有興趣的網(wǎng)友參考。
1. 蒙特卡羅算法。
該算法又稱隨機(jī)性模擬算法,是通過(guò)計(jì)算機(jī)仿真來(lái)解決問(wèn)題的算法,同時(shí)可以通過(guò)模擬來(lái)檢驗(yàn)自己模型的正確性,幾乎是比賽時(shí)必用的方法。
2. 數(shù)據(jù)擬合、參數(shù)估計(jì)、插值等數(shù)據(jù)處理算法。
比賽中通常會(huì)遇到大量的數(shù)據(jù)需要處理,而處理數(shù)據(jù)的關(guān)鍵就在于這些算法,通常使用MATLAB 作為工具。
3. 線性規(guī)劃、整數(shù)規(guī)劃、多元規(guī)劃、二次規(guī)劃等規(guī)劃類算法。
建模競(jìng)賽大多數(shù)問(wèn)題屬于最優(yōu)化問(wèn)題,很多時(shí)候這些問(wèn)題可以用數(shù)學(xué)規(guī)劃算法來(lái)描述,通常使用Lindo、Lingo 軟件求解。
4. 圖論算法。
這類算法可以分為很多種,包括最短路、網(wǎng)絡(luò)流、二分圖等算法,涉及到圖論的問(wèn)題可以用這些方法解決,需要認(rèn)真準(zhǔn)備。
5. 動(dòng)態(tài)規(guī)劃、回溯搜索、分治算法、分支定界等計(jì)算機(jī)算法。
這些算法是算法設(shè)計(jì)中比較常用的方法,競(jìng)賽中很多場(chǎng)合會(huì)用到。
6. 最優(yōu)化理論的三大非經(jīng)典算法:模擬退火算法、神經(jīng)網(wǎng)絡(luò)算法、遺傳算法。
這些問(wèn)題是用來(lái)解決一些較困難的最優(yōu)化問(wèn)題的,對(duì)于有些問(wèn)題非常有幫助,但是算法的實(shí)現(xiàn)比較困難,需慎重使用。
7. 網(wǎng)格算法和窮舉法。
兩者都是暴力搜索最優(yōu)點(diǎn)的算法,在很多競(jìng)賽題中有應(yīng)用,當(dāng)重點(diǎn)討論模型本身而輕視算法的時(shí)候,可以使用這種暴力方案,最好使用一些高級(jí)語(yǔ)言作為編程工具。
8. 一些連續(xù)數(shù)據(jù)離散化方法。
很多問(wèn)題都是實(shí)際來(lái)的,數(shù)據(jù)可以是連續(xù)的,而計(jì)算機(jī)只能處理離散的數(shù)據(jù),因此將其離散化后進(jìn)行差分代替微分、求和代替積分等思想是非常重要的。
9. 數(shù)值分析算法。
如果在比賽中采用高級(jí)語(yǔ)言進(jìn)行編程的話,那些數(shù)值分析中常用的算法比如方程組求解、矩陣運(yùn)算、函數(shù)積分等算法就需要額外編寫庫(kù)函數(shù)進(jìn)行調(diào)用。
10. 圖象處理算法。
賽題中有一類問(wèn)題與圖形有關(guān),即使問(wèn)題與圖形無(wú)關(guān),論文中也會(huì)需要圖片來(lái)說(shuō)明問(wèn)題,這些圖形如何展示以及如何處理就是需要解決的問(wèn)題,通常使用MATLAB 進(jìn)行處理。