計算機算法

計算機算法

計算機算法是以一步接一步的方式來詳細描述計算機如何將輸入轉化為所要求的輸出的過程,或者說,算法是對計算機上執行的計算過程的具體描述。

基本信息

簡介

計算機算法計算機算法
在計算機編程中,通常有多種不同的方法(算法),可以用來完成任何給定的任務。在不同的情況下,每種算法都有自己的優缺點。許多研究都是通過排序來完成的,因為計算機的大量時間都用在了列表排序上。以下是排序中使用的五種不同算法:
箱排序
歸併排序
冒泡排序
希爾排序
快速排序

如果您有一百萬個1到10之間的整數值需要排序,則應使用箱排序算法。如果您有一百萬個書籍標題,那么快速排序可能是最佳算法。知道不同算法的優缺點後,您就可以為手上的任務挑選出最佳算法了。

重要算法

A*搜尋算法
俗稱A星算法。這是一種在圖形平面上,有多個節點的路徑,求出最低通過成本的算法。常用於遊戲中的NPC的移動計算,或線上遊戲的BOT的移動計算上。該算法像Dijkstra算法一樣,可以找到一條最短路徑;也像BFS一樣,進行啟發式的搜尋。
BeamSearch
束搜尋(beamsearch)方法是解決最佳化問題的一種啟發式方法,它是在分枝定界方法基礎上發展起來的,它使用啟發式方法估計k個最好的路徑,僅從這k個路徑出發向下搜尋,即每一層只有滿意的結點會被保留,其它的結點則被永久拋棄,從而比分枝定界法能大大節省運行時間。束搜尋於20世紀70年代中期首先被套用於人工智慧領域,1976年Lowerre在其稱為Harpy的語音識別系統中第一次使用了束搜尋方法,他的目標是並行地搜尋幾個潛在的最優決策路徑以減少回溯,並快速地獲得一個解。
二分取中查找算法
一種在有序數組中查找某一特定元素的搜尋算法。搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。這種搜尋算法每一次比較都使搜尋範圍縮小一半。
Branchandbound
分支定界(branchandbound)算法是一種在問題的解空間樹上搜尋問題的解的方法。但與回溯算法不同,分支定界算法採用廣度優先或最小耗費優先的方法搜尋解空間樹,並且,在分支定界算法中,每一個活結點只有一次機會成為擴展結點。
數據壓縮
數據壓縮是通過減少計算機中所存儲數據或者通信傳播中數據的冗餘度,達到增大數據密度,最終使數據的存儲空間減少的技術。數據壓縮在檔案存儲和分散式系統領域有著十分廣泛的套用。數據壓縮也代表著尺寸媒介容量的增大和網路頻寬的擴展。
Diffie–Hellman密鑰協商
Diffie–Hellmankeyexchange,簡稱“D–H”,是一種安全協定。它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道建立起一個密鑰。這個密鑰可以在後續的通訊中作為對稱密鑰來加密通訊內容。
Dijkstra’s算法
迪科斯徹算法(Dijkstra)是由荷蘭計算機科學家艾茲格·迪科斯徹(EdsgerWybeDijkstra)發明的。算法解決的是有向圖中單個源點到其他頂點的最短路徑問題。舉例來說,如果圖中的頂點表示城市,而邊上的權重表示著城市間開車行經的距離,迪科斯徹算法可以用來找到兩個城市之間的最短路徑。
動態規劃
動態規劃是一種在數學和計算機科學中使用的,用於求解包含重疊子問題的最最佳化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種算法的基礎,被廣泛套用於計算機科學和工程領域。比較著名的套用實例有:求解最短路徑問題,背包問題,項目管理,網路流最佳化等。這裡也有一篇文章說得比較詳細。
歐幾里得算法
在數學中,輾轉相除法,又稱歐幾里得算法,是求最大公約數的算法。輾轉相除法首次出現於歐幾里得的《幾何原本》(第VII卷,命題i和ii)中,而在中國則可以追溯至東漢出現的《九章算術》。
最大期望(EM)算法
在統計計算中,最大期望(EM)算法是在機率(probabilistic)模型中尋找參數最大似然估計的算法,其中機率模型依賴於無法觀測的隱藏變數(LatentVariable)。最大期望經常用在機器學習和計算機視覺的數據聚類(DataClustering)領域。最大期望算法經過兩個步驟交替進行計算,第一步是計算期望(E),利用對隱藏變數的現有估計值,計算其最大似然估計值;第二步是最大化(M),最大化在E步上求得的最大似然值來計算參數的值。M步上找到的參數估計值被用於下一個E步計算中,這個過程不斷交替進行。
快速傅立葉變換(FFT)
快速傅立葉變換(FastFourierTransform,FFT),是離散傅立葉變換的快速算法,也可用於計算離散傅立葉變換的逆變換。快速傅立葉變換有廣泛的套用,如數位訊號處理、計算大整數乘法、求解偏微分方程等等。
哈希函式
HashFunction是一種從任何一種數據中創建小的數字“指紋”的方法。該函式將數據打亂混合,重新創建一個叫做散列值的指紋。散列值通常用來代表一個短的隨機字母和數字組成的字元串。好的散列函式在輸入域中很少出現散列衝突。在散列表和數據處理中,不抑制衝突來區別數據,會使得資料庫記錄更難找到。
堆排序
Heapsort是指利用堆積樹(堆)這種數據結構所設計的一種排序算法。堆積樹是一個近似完全二叉樹的結構,並同時滿足堆積屬性:即子結點的鍵值或索引總是小於(或者大於)它的父結點
歸併排序
Mergesort是建立在歸併操作上的一種有效的排序算法。該算法是採用分治法(DivideandConquer)的一個非常典型的套用。
ransac算法
RANSAC是”RANdomSAmpleConsensus”的縮寫。該算法是用於從一組觀測數據中估計數學模型參數的疊代方法,由FischlerandBolles在1981提出,它是一種非確定性算法,因為它只能以一定的機率得到合理的結果,隨著疊代次數的增加,這種機率是增加的。該算法的基本假設是觀測數據集中存在”inliers”(那些對模型參數估計起到支持作用的點)和”outliers”(不符合模型的點),並且這組觀測數據受到噪聲影響。RANSAC假設給定一組”inliers”數據就能夠得到最優的符合這組點的模型。
RSA加密演算法
這是一個公鑰加密算法,也是世界上第一個適合用來做簽名的算法。今天的RSA已經專利失效,其被廣泛地用於電子商務加密,大家都相信,只要密鑰足夠長,這個算法就會是安全的。
並查集Union-find
並查集是一種樹型的數據結構,用於處理一些不相交集合(DisjointSets)的合併及查詢問題。常常在使用中以森林來表示。
Viterbialgorithm
尋找最可能的隱藏狀態序列(Findingmostprobablesequenceofhiddenstates)。

特性

1.有窮性。一個算法應包含有限的操作步驟,而不能是無限的。事實上“又窮性”往往指“在合理的範圍之內”。如果讓計算機執行一個歷時1000年才結束的算法,這雖然是有窮的,但超過了合理的限度,人們不把他是為有效算法。
2.確定性。算法中的每一個步驟都應當是確定的,而不應當是確定的,而不應當是含糊的、模稜兩可的。算法中的每一個步驟應當不致被解釋成不同的含義,而應是十分明確的。也就是說,算法的含義應當是唯一的,而不應當產生“歧義性”。
3.有零個或多個輸入、所謂輸入是指在執行算法是需要從外界取得必要的信息。
4.有一個或多個輸出。算法的目的是為了求解,沒有輸出的算法是沒有意義的。
5.有效性。算法中的每一個步驟都應當能有效的執行。並得到確定的結果。

評價

一個算法的優劣可以用空間複雜度與時間複雜度來衡量。
算法的時間複雜度是指算法需要消耗的時間資源。一般來說,計算機算法是問題規模n的函式f(n),算法執行的時間的增長率與f(n)的增長率正相關,稱作漸進時間複雜度(AsymptoticTimeComplexity)。時間複雜度用“O(數量級)”來表示,稱為“階”。常見的時間複雜度有:O(1)常數階;O(log2n)對數階;O(n)線性階;O(n2)平方階。

算法的空間複雜度是指算法需要消耗的空間資源。其計算和表示方法與時間複雜度類似,一般都用複雜度的漸近性來表示。同時間複雜度相比,空間複雜度的分析要簡單得多。

十位大師

影響計算機算法世界的十位大師

偉大的智者——DonE.Knuth,中文名:高德納(1938-)

算法和程式設計技術的先驅者。Oh,God!一些國外網站這樣評價他。一般說來,不知道此人的程式設計師是不可原諒的。其經典著作《電腦程式設計藝術》更是被譽為算法中“真正”的聖經,像KMP和LR(K)這樣令人不可思議的算法,在此書比比皆是。難怪連BillGates都說:“如果能做對書里所有的習題,就直接來微軟上班吧!”
對於DonE.Knuth本人,一生中獲得的獎項和榮譽不計其數,包括圖靈獎,美國國家科學金獎,美國數學學會斯蒂爾將(AMSSteelPrize),以及發明先進技術榮獲的極受尊重的京都獎(KyotoPrize)等等,寫過19部書和160餘篇論文,每一篇著作都能用影響深遠來形容。DonE.Knuth也被公認是美國最聰明的人之一。當年他上大學的時候,常寫些各種各樣的編譯器來掙外快,只要是他參加的編程比賽,總是第一名,同時也是世上少有的編程達到40年以上的程式設計師之一。他除了是技術與科學上的泰斗外,更是無可非議的寫作高手,技術文章堪稱一絕,文風細膩,講解透徹,思路清晰而且沒有學究氣,估計這也是《電腦程式設計藝術》被稱為聖經的原因之一。
首席算法官UdiManber

世界上還有如此奇怪的職位?但是對於Amazon乃至Google來說,這一點也不奇怪。UdiManber,這位前Amazon的“首席算法官”,現在是Google負責工程事務的副總裁。他研究WWW的應用程式、搜尋以及隱藏在這背後的算法設計。在此期間,他與其他人共同開發了Agrep、Glimpse和Harvest等Unix上的搜尋軟體。1998年,Udi成為了Yahoo!的首席科學家。2002年,Amazon創造性地給了Udi“首席算法官”的職位,和Udi為Amazon的“SearchInsidetheBook”搜尋項目所做的工作相得益彰。
Udi還因為他所著的IntroductiontoAlgorithms——ACreativeApproach而被大家稱道。
謙遜的長者——EdsgerWybeDijkstra

1930年出生於荷蘭阿姆斯特丹,2002年逝世於荷蘭紐南。他在祖國荷蘭獲得數據和物理學學士,理論物理博士學位,2000年退休前一直是美國Texas大學的計算機科學和數學教授。以發現了圖論中的最短路徑算法(Dijkstra算法)而聞名於世,1972年因為ALGOL第二代程式語言而獲得圖靈獎。“GoToStatementConsideredHarmful”(EWD215)也是被廣為傳頌的經典之作。除了科學研究之外,他最喜歡做的事情就是教學,被人稱作“一天教學24小時”的教授。
且不說Dijkstra算法對計算科學,網路科學發展的深遠影響,單從他在1972年獲得圖靈獎時的演講“TheHumbleProgrammer”就不得不肅然起敬,在獲得計算機科學中至高無上的獎項時,EdgsWybeDijkstra仍然稱自己不過是一個謙遜普通的程式設計師,何等胸襟,舉世之中幾人可比。
運籌學大師——GeorgeDantizig

可謂是由父親一手培養出的天才。George的父親是俄國人,曾在法國師從著名的科學家HenriPoincare。他曾經這樣回憶自己的父親:“在我還是箇中學生時,他就讓我做幾千道幾何題……解決這些問題的大腦訓練是父親給我的最好禮物。這些幾何題,在發展我分析能力的過程中,起了最最重要的作用。”
在伯克利學習的時候,有一天George上課遲到,只看到黑板上寫著兩個問題,他只當是課堂作業,隨即將問題抄下來並做出解答。六個月後,這門課的老師——著名的統計學家JerzyNeyman——幫助他把答案整理了一下,發表為論文,George這才發現自己解決了統計學領域中一直懸而未決的兩個難題。
George後來在運籌學建樹極高,獲得了包括“馮諾伊曼理論獎”在內的諸多獎項。他在Linearprogrammingandextensions一書中研究了線性編程模型,為計算機語言的發展做出了不可磨滅的貢獻。天妒英才,他於2005年5月13日去世。
推動時代前進的人——JamesCooley(1926-)

美國數學家,哥倫比亞大學的數學博士,以他所創造的快速傅立葉變換(FFT)而著名,不能不說是意義極其重大,FFT的數學意義不光在於使大家明白了傅立葉(Fourier)變換計算起來是多么容易,而且使得數位訊號處理技術取得了突破性的進展,對於現在的網路通信,圖形圖像處理等等領域的發展與前進奠定了基礎。Fourier變化的意義在於將電能變為了工業的命脈,而FFT的意義更是在於他推動了整個社會信息化的進程。在IBM研究中心中主要從事數位訊號處理的研究一直到1992年退休,同時他還是IEEE的數位訊號處理委員會的成員。1980年獲得ASSP'sMeritoriousServiceAward,1984年獲得ASSPSocietyAward以及IEEECentennialMedal。
FORTRAN之父——John·Backus

早年在Hill·School學習的時候因為討厭學習,成績一踏糊塗而不得不在暑假補課。1943年他在父親的要求下到維吉尼亞大學學習化學,隨後參軍、照顧頭部受傷的傷員、在醫學學校學習治療,可是最後又都放棄了。不過還好,戰後Backus進入紐約哥倫比亞大學學習數學,並於1949年畢業。在畢業前夕,他跑到了麥迪遜大街的IBM計算機中心參觀。事情湊巧,和導遊聊天的時候Backus談到自己正在找工作,在導遊的鼓勵下,他和中心一位主管的面談,成為了一名IBM的程式設計師。
在IBM,Backus的才華得到了施展,發明了人類歷史上第一個高級語言——FORTRAN。接著,又提出了規範描述程式語言語法的Backus-Naur xxxx(BNF)。這位當年的“差生”終於被整個計算機世界肯定——美國計算機協會於1977年授予John Backus圖靈獎。
實踐探索先鋒——JonBentley

1974年獲得了史丹福大學的學士學位,1976年獲得北卡羅萊納大學的碩士和博士學位。畢業後在卡耐基梅隆大學教授了6年計算機科學課程,1982年進入貝爾實驗室。2001年退休後加入了現在的Avaya實驗室,他還曾作為訪問學者在西點軍校和普林斯頓大學工作。他的研究領域包括編程技術、算法設計、軟體工具和界面設計等等。
他寫作過三本編程書籍,其中最著名的就是涵蓋從算法理論到軟體工程各種主題的ProgrammingPearls(《編程珠璣》),這其實是他發表過的文章的合集。在這些文章里,Jon從工程實現的角度出發,為程式設計師們提供了一個個艱難問題的解決方案,猶如一顆顆閃閃發亮的珍珠。Bentley的珍珠超出了可靠工程學的範疇,利用他的洞察力和創造力為那些惱人的問題提供了獨特而巧妙的解決方案。
Pascal之父——NicklausWirth

如果說有一個人因為一句話而得到了圖靈獎,那么這個人應該就是NicklausWirth,這句話就是他提出的著名公式“算法+數據結構=程式”。這個公式對計算機科學的影響程度足以類似物理學中愛因斯坦的“E=MC^2”——一個公式展示出了程式的本質。
NicklausWirth,1934年出生於瑞士,1963年在加州大學伯克利分校取得博士學位。取得博士學位後直接被以高門檻著稱的史丹福大學聘到剛成立的計算機科學系工作。在史丹福大學成功的開發出AlgolW以及PL360後,愛國心極強的NicklausWirth於1967年回到祖國瑞士,第二年在他的母校蘇黎世工學院他創建與實現了Pascal語言——當時世界上最受歡迎的語言之一。後來他的學生PhilipeKahn畢業後和AndersHejlsberg(Delphi之父)創辦了Borland公司靠TurboPascal起家,很快成為了將Borland發展成為全球最大的開發工作廠商,這一切都不得不說要歸工於PASCAL語言的魅力。PASCAL已經影響了整整幾代的程式設計師,NicklausWirth的思想還將會繼續指引現在和以後的程式設計師前進的方向。
算法的講解者——RobertSedgewick

RobertSedgewick是普林斯頓大學的計算機科學教授。他還是AdobeSystems的一名主管,也曾作為訪問學者在XeroxPARC、IDA和INRIA工作。他在史丹福大學獲得博士學位。他的著作包括AlgorithminC、AlgorithminC++、AlgorithminJava等系列書籍,這些都再版多次。“沒有人能夠將算法和數據結構解釋得比RobertSedgewick更清楚易懂了!”很多讀過他著作的程式設計師這樣說。
目前Robert正在研究算法設計、數據結構、算法分析等方面的基礎理論。他善於通過數學方法評估和預測算法性能,設法發現算法、數據結構的通用機制,例如使用逼近方法尋找更快速更高效的算法。另外,他還將算法和圖形學結合起來,例如使用可視化方法評估算法效率,算法的圖形化模擬,用於出版物的高質量算法表現方法等等。
計算機領域的爵士——TonyHoare

TonyHoare1934年出生於英國,1959年博士畢業於俄羅斯莫斯科國立大學,獲得語言機器翻譯專業學士學位。1960年發布了使他聞名於世的快速排序算法(QuickSort),這個算法也是當前世界上使用最廣泛的算法之一。
TonyHoare在取得博士學位後,就職於ElliottBrothers,領導了Algol60第一個商用編譯器的設計與開發,由於其出色的成績,最終成為該公司首席科學家。從1977年開始,TonyHoare博士任職於牛津大學,投身於計算系統的精確性的研究、設計及開發。因其對Algol60程式設計語言理論、互動式系統及APL的貢獻,1980年被美國計算機協會授予“圖靈獎”。
1999年在牛津大學退學後,TonyHoare博士被微軟劍橋研究院聘請擔任高級程式設計師,從事微軟劍橋研究院研究生成果的工業化套用的工作,以及協助其它研究人員進行服務於軟體產業及用戶的長期基礎研究項目。2000年因為其在計算機科學與教育上做出的貢獻被封為爵士。

其他

此外還有兩位大師不在此文中,但是也必須提一下他們對計算機算法的貢獻。
1986年圖靈獎由康乃爾大學機器人實驗室主任約翰·霍潑克洛夫特(JohnEdwardHopcroft)和普林斯頓大學計算機科學系教授羅伯特·塔揚(RobertEndretarjan)共享,而塔揚曾是霍潑克洛夫特的學生。這師生兩人由於在數據結構和算法的分析和設計方面的許多創造性貢獻而共同獲此殊榮,在業界傳為美談。

相關詞條

相關搜尋

熱門詞條

聯絡我們