設萬維讀者為首頁 廣告服務 聯繫我們 關於萬維
簡體 繁體 手機版
分類廣告
版主:諍友
萬維讀者網 > 教育學術 > 帖子
曾毅: 計算機科學數學理論淺談
送交者: 曾毅 2005年04月18日13:39:51 於 [教育學術] 發送悄悄話


計算機科學數學理論淺談 by 曾毅


計算機自從其誕生之日起,它的主要任務就是進行各種各樣的科學計算。文檔處理,數據處理,圖像處理,硬件設計,軟件設計等等,都可以抽象為兩大類:數值計算與非數值計算。作為研究計算機科學技術的人員,我們大都對計算數學對整個計算機科學的重要性有一些了解。但是數學對我們這些專業的研究和應用人員究竟有多大的用處呢?我們先來看一下下面的一個流程圖:

上圖揭示了利用計算機解決科學計算的步驟,實際問題轉換為程序,要經過一個對問題抽象的過程,建立起完善的數學模型,只有這樣,我們才能建立一個設計良好的程序。從中我們不難看出計算數學理論對用計算機解決問題的重要性。下面我們將逐步展開對這個問題的討論。

計算機科學的數學理論體系是相當龐雜的,筆者不敢隨意劃分,參考計算機科學理論的學科體系,我們談及的問題主要涉及:數值計算,離散數學,數論,計算理論四大方向。


[一] 數值計算(Numerical Computation)

主要包括數值分析學、數學分析學、線性代數、計算幾何學、概率論與數理統計學。

數值分析學又常被稱為計算方法學,是計算理論數學非常重要的一個分支,主要研究數值型計算。研究的內容中首先要談談數值計算的誤差分析,誤差是衡量我們的計算有效與否的標準,我們的算法解決問題如果在誤差允許的範圍內,則算法是有效的,否則就是一個無效的問題求解。另外就是數值逼近,它研究關於如何使用容易數值計算的函數來近似地代替任意函數的方法與過程。感覺應用比較廣的不得不提切雪比夫逼近和平方逼近了。筆者曾經嘗試過的就是通過最佳平方逼近進行曲線的擬合,開發工具可以選擇VC++或者Matlab。插值函數是另外一個非常重要的方面,現代的計算機程序控制加工機械零件,根據設計可給出零件外形曲線的某些型值點,加工時走刀方向及步數,就要通過插值函數計算零件外形曲線及其他點函數值。至於方程求根、線性方程組求解,一般的計算性程序設計問題都會多多少少的涉及一些,我們這裡就不贅述了。關於數值分析學的一個學習誤區就是僅僅學習理論知識,而很難和程序設計結合起來,實際上通過上面的論述,大家已經能夠初步地認識到這個學科是應當與程序設計緊密聯繫才能夠體現它的重要性的。關於理論的學習,推薦華中科技大學李慶揚老師的《數值分析》。然而理論學習畢竟是個過程,最終的目標還是要用於程序設計解決實際的計算問題,向這個方向努力的書籍還是挺多的,這裡推薦大家高等教育出版社(CHEP)和施普林格出版社(Springer)聯合出版的《計算方法(Computational Methods)》,華中理工大學數學系寫的(現華中科技大學),這方面華科大做的工作在國內應算是比較多的,而個人認為以這本最好,至少程序設計方面涉及了:任意數學函數的求值,方程求根,線性方程組求解,插值方法,數值積分,場微分方程數值求解。

數學分析學很多學校在近些年已經替代高等數學被安排到了本科教學當中。原因是很簡單的,高等數學雖然也是非常有用的工程數學,介紹的問題方法也被廣泛的應用,但是正如大家所知道的,高等數學不太嚴格的說,基本上就是偏向於計算的數學分析,當然省去了數學分析非常看重的推理證明,然而我們認為這一部分正是我們最需要的。這對我們培養良好的分析能力和推理能力極有幫助。我的軟件工程學導師北工大數理學院的王儀華先生就曾經教導過我們,數學系的學生到軟件企業中大多作軟件設計與分析工作,而計算機系的學生做初級程序員的居多,原因就在於數學系的學生分析推理能力,從所受訓練的角度上要遠遠在我們平均水平之上。談到這方面的書籍,公認北京大學張築生老師的《數學分析新講》為最好。張築生教授一生寫的書並不太多,但是只要是寫出來的每一本都是本領域內的傑作,這本當然更顯突出些。這種老書看起來不僅是在傳授你知識,而是在讓你體會科學的方法與對事物的認識方法。現在多用的似乎是復旦大學的《數學分析》,高等教育出版社的,也是很好的教材。但關於如何去利用從中獲得的推理證明能力,我們在遇到具體問題的時候,可以在今後的文章詳細討論。

線性代數是我們在工科本科學習的必修課程,似乎大家找不到到底這個有什麼用,其實很明顯,線性代數作為工程數學的重要分支,在計算機領域的研究有相當廣泛的應用。最為突出的可以談談數組和矩陣的相關知識:

下面談一個我經常作為例子和同學討論的問題:四個城市之間的航線如圖所示:


令aij=1,表示從i市到j市有1條航線
令aij=0,表示從i市到j市沒有單項航線
則圖可用矩陣表示:
A= (aij) =

我們可以採用程序設計實現這個問題,如果輔以權值,可以轉化為最短路徑的問題,再複雜化一點還可以轉化為具有障礙物的最短路徑問題,這就會涉及一些如Dijkstra算法等高級程序設計算法話題。這些都依靠着數組、矩陣的基本知識。數組的應用主要在圖像處理以及一些程序設計理論。矩陣的運算領域極為廣泛,比如在計算機圖形學當中曲線曲面的構造,圖像的幾何變換,包括平移、鏡像、轉置、縮放。在高級圖像問題更有廣泛應用,例如在圖像增強技術,投影技術中的應用。

計算幾何學研究的是幾何外形信息的計算機表示。包括幾何查找、多邊形、凸包問題、交與並、幾何體的排列、幾何拓撲網絡設計、隨機幾何算法與並行幾何算法。它構成了計算機圖形學中的基本算法,是動畫設計,製造業計算機輔助設計的基礎。如果從事這方面的深入研究,可以參考中國計算機學會周培德先生的《計算幾何——算法分析與設計》。

概率論與數理統計學是這個領域最後一門關鍵的課程。概率論部分提供了很多問題的基本知識描述,比如模式識別當中的概率計算,參數估計等等。數理統計部分有很多非常經典的內容,比如偽隨機數、蒙特卡羅法、回歸分析、排隊論、假設檢驗、以及經典的馬科夫過程。尤其是隨機過程部分,是分析網絡和分布式系統,設計隨機化算法和協議非常重要的基礎。


[二]離散數學(Discrete Mathematics)

隨着計算機科學的出現與廣泛應用,人們發現利用計算機處理的數學對象與傳統的分析有明顯的區別:分析研究的問題解決方案是連續的,因而微分,積分成為基本的運算;而這些分支研究的對象是離散的,因而很少有機會進行此類的計算。人們從而稱這些分支為"離散數學"。離散數學經過幾十年發展,方向上基本上穩定下來。當然不同時期還有很多新內容補充進來。就學科方向而言,一般認為,離散數學包含:集合論、邏輯學、代數學、圖論、組合學。


邏輯學(Logics)

我們主要指數理邏輯,形式邏輯在推理問題中也有比較廣泛的應用。(比如我們學校還為此專門開設了選修課程)這方面的參考推薦中科院軟件所陸鍾萬教授的《面向計算機科學的數理邏輯》。現在可以找到陸鍾萬教授的講課錄像,http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm。總的來說,學集合/邏輯一定要站在理解的高度上去思考相關的問題。集合論(Set Theory)和邏輯學構成了計算機科學最重要的數學問題描述方式。


代數學(Algebra)

包括:抽象代數、布爾代數、關係代數、計算機代數

(1)抽象代數(Abstract Algebra)研究的主要內容涵蓋群、環、域。抽象代表的是將研究對象的本質提煉出來,加以高度概括,來描述其形象。“歐式環”就是在將整數和多項式的一些相同的特點加以綜合提煉引入的。抽象代數提供的一些結論為我們研究一些具體問題時所需使用的一些性質提供了依據。推薦一個最簡單的,最容易學的材料:http://www.math.miami.edu/~ec/book/這本《Introduction to Linear and Abstract Algebra》非常通俗易懂,而且把抽象代數和線性代數結合起來,對初學者來說非常理想。

(2)布爾代數(Boolean Algebra)是代數系統中最為基礎的部分,也是最核心的基本理論。主要包括了集合的基本概念與運算,自對偶的公理系統。是數據表示的重要基礎。相信大家都很清楚它的重要性。

(3)關係代數(Relational Algebra)應用也是極為廣泛,比如數據庫技術中的關係數據庫的構建就要用到關係代數的相關理論。

(4)計算機代數(Computer Algebra)大家可能比較生疏,其實它研究的主要內容即是圍繞符號計算與公式演算展開的。是研究代數算法的設計、分析、實現及其應用的學科。主要求解非數值計算,輸入輸出用代數符號表示。計算機代數的開發語言主要有: ALTRAN,CAMAL,xxxxAL。主要應用於:射影幾何,工業設計,機器人手臂運動設計。


圖論(Graph Theory)

主要研究的內容包括:圖的基本概念、基本運算、矩陣表示,路徑、迴路和連通性,二部圖、平面圖,樹,以及網絡流。圖論的應用領域太過廣泛,僅舉兩個例子:比如在計算機網絡拓撲圖的設計與結構描述中,就必須用到相當多的圖的結構和基本概念。關於網絡流更是在電流網絡與信息網絡的流量計算當中廣泛應用。樹的相關應用則無須多言了。


組合學(Combinatorics)

有兩部分單獨的研究領域:組合數學與組合算法。組合學問題的算法,計算對象是離散的、有限的數學結構。從方法學的角度,組合算法包括算法設計和算法分析兩個方面。關於算法設計,歷史上已經總結出了若干帶有普遍意義的方法和技術,包括動態規劃、回溯法、分支限界法、分治法、貪心法等。應用是相當廣泛的,比如旅行商問題、圖着色問題、整數規劃問題。關於組合數學,主要研究的內容有:鴿巢原理、排列與組合、二項式係數容斥原理及應用,遞推關係和生成函數、特殊計數序列、二分圖中的匹配、組合設計。推薦Richard A.Brualdi的《Introductory Combinatorics》作為參考。


[三]數論(Number Theory)

數論這門學科最初是從研究整數開始的,所以叫做整數論。後來更名為數論。它包括以下幾個分支:

初等數論是不求助於其他數學學科的幫助,只依靠初等方法來研究整數性質的數論分支。比如在數論界非常著名的“中國剩餘定理”,就是初等數論中很重要的內容。對於程序設計來說這部分也是相當有價值的,如果你對中國剩餘定理比較清楚,利用它,你可以將一種表達式經過簡單的轉換後得出另一種表達式,從而完成對問題分析視角的轉換。

解析數論是使用數學分析作為工具來解決數論問題的分支。是解決數論中比較深刻問題的強有力的工具。我國數學家陳景潤在嘗試解決“哥德巴赫猜想”問題中使用的就是解析數論的方法。以素數定理為基礎解決計算素數的問題及其算法實現應是我們多多關注的。

代數數論是把整數的概念推廣到一般代數數域上去,建立了素整數、可除性等概念。程序設計方面涉及的比較多的是代數曲線的研究,比如說橢圓曲線理論的實現。

幾何數論研究的基本對象是“空間格網”。空間格網就是指在給定的直角坐標繫上,坐標全是整數的點,叫做整點;全部整點構成的組就叫做空間格網。空間格網對計算幾何學的研究有着重大的意義。幾何數論涉及的問題比較複雜,必須具有相當的數學基礎才能深入研究。

總的說來,由於近代計算機科學的發展,數論得到了廣泛的應用。比如在計算方法、代數編碼、組合學理論等方面都廣泛使用了初等數論範圍內的許多研究成果;現在有些國家應用“孫子定理”來進行測距,用原根和指數來計算離散傅里葉變換等。如果你曾經系統的學習過數論算法,你會發現這個分支學科研究的一些基本問題對程序設計是相當有用的,比如說素數問題、素性測試、因子分解、最大公約數、模取冪運算、求解同餘線性方程。其中的很多問題都是程序設計的基本問題。但這些問題都不能小視,舉個例子來說吧,關於求最大公約數的程序,筆者曾經嘗試的就可以採用循環語句結構和遞歸結構。另外,以大素數為基礎的密碼體系的建立是近些年數論算法廣泛應用的一個重要的原因。原理是大素數的乘積重新分解因數十分困難。RSA公鑰加密系統的構建就是基於這個原理的(三位發明人因此也獲得了2002年美國計算機協會頒發的圖靈獎)。


[四]計算理論(Theory of Computation)

涉及的內容是科學計算非常重要的一部分分支,也是大家研究相當多的一部分。主要包括:算法學,計算複雜性,程序理論。

  算法學(Algorithms)在計算機科學理論中有着舉足輕重的地位。是解決很多數值型,非數值型問題的基礎。記得一次學校接收招標項目,很多中小型軟件廠商都無法完成一個軟件的功能模塊,就是因為當時他們對一個具體問題的算法不能做出正確的抽象,最後由我們學校數理學院的一支軟件團隊承擔了這項任務,他們的最終報告體現出來,問題的解決策略只有通過人工神經元網絡的反向傳播算法。可見在比較有深度的程序設計中,算法的重要性更為突出。學習算法學要有一個長期的理論和實踐的過程。遇到一個具體算法問題時,首先要通過自己描述的數學抽象步驟,看看自己以前有沒有處理過這種問題。如果沒有,很可能這個問題是多個算法的綜合,或者是需要我們自己去構造算法。這就需要我們有紮實的算法功底,為了打好這個功底,推薦兩套聖經級的書籍首先是Thomas H.Cormen等著的《Introduction to Algorithms》。對算法學習而言,這一本內容相當的全面。再深一點的就是大家作為常識都知道的《The Art of Computer Programming》,目前已經出版3冊。兩本書的價值大家應當都是清楚的。

計算複雜性研究的內容很廣,其中包括NP完全性理論,可計算性理論,自動機理論,形式語言理論(包括廣泛應用於編譯原理領域的文法,還包括Petri網論的相關內容)以及大家熟知的複雜性度量。時間複雜度、空間複雜度的計算是度量算法非常重要的參數,也是我們衡量程序優劣程度的重要依據。

程序理論(Theory of programs)包含了形式語義學,程序驗證和並發模型的研究。關於程序驗證學習的重要性大家都很清楚,學習的方法自然也是多多結合具體的問題去分析。關於並發模型,主要研究的就是進程代數,通信系統演算,通信順序進程。這部分是研究操作系統理論與實現的重要基礎。

按照計算機科學數學理論的架構來談了各方面的內容和一些應用,下面我們再單獨來看一些上面沒有涉及到的學科與這些理論的具體結合情況:

設計方面的應用剛才談的很多,我只再說說數據庫原理與技術,這方面用到的重要數學基礎主要包括:集合論,二元關係及其推理(尤其是研究關係數據庫),研究數據分布與數據庫結構又涉及相當多的圖論知識。

計算機科學的發展有賴於硬件技術和軟件技術的綜合。在設計硬件的時候應當充分融入軟件的設計思想,才能使硬件在程序的指揮下發揮極致的性能。在軟件設計的時候也要充分考慮硬件的特點,才能衝破軟件效率的瓶頸。達到硬件和軟件設計的統一,嚴格的說這並不輕鬆,一般的程序設計者很難將這樣的思想貫穿在其程序設計當中。僅舉個簡單的例子:我們在寫一些C語言的程序,必要的時候都會採取內嵌一段匯編指令,這就是比較充分地考慮了硬件的工作情況,從而能夠提高程序運行的效率。所以我們也有必要了解一些硬件的基礎知識。關於學習硬件的時候常會用到的基本數學思想也是相當多的,拿電路基礎與模擬電路來說,我們就經常要利用多元函數,不等式計算進行電流電壓的計算。能量的計算還常常涉及微積分學的很多計算。在數字電子技術當中(有時也稱數字邏輯學)數理邏輯,尤其是邏輯演算部分運用相當廣泛,數制轉換更是非常重要的基礎,各種數字電路參數的計算則是多元函數,不等式的計算解決的問題。

從事計算機硬件程序設計的程序員,則不可迴避的就是數字信號處理。這門科學所用到的數學基礎主要有:三角函數、微積分、高次方程求解、數值逼近,傅里葉變換。在濾波器的設計當中還會用到矩陣運算。筆者曾經研究過一個VC++環境下開發的濾波器的模擬軟件,就是利用萊文遜-杜賓遞推算法,在較大規模的矩陣運算基礎上進行的。當然,開發的環境不一定是這個,你也可以選擇MATLAB或者純C語言編譯器。如果我們不了解相關的數學基礎,不要說程序設計,就算是建立運算模型都是相當困難的。

一些周圍的同學和一些在職的程序員,大家經過一段時間的學習,普遍都覺得數學對學習計算機和研究計算機程序設計等問題來說非常重要,但是又苦於無從下手。上面比較全面地談及了計算機科學數學理論的相關內容。需要特別指明的是,我們研究問題的精力是有限的,如果您是在校的計算機系學生,則可以對上面的方方面面都有所涉及,以嘗試計算數學這個強大的理論工具。為今後的工作奠定一個堅實的基礎。但是如果您研究的是比較具體的工作,我們並不推薦您研究所有的內容,最好的方法就是對上面的數學基礎都有些了解,然後遇到具體工作,需要哪部分內容,再進行深入的學習與研究。這樣針對性比較強的學習效果是會比較顯著的。對於上面推薦的一些參考材料,除非你要花相當長的一段時間來提高你的計算機數學理論。否則也沒必要每一頁,每一本都字字精讀,還是那個原則,按需索取其中的內容。學習的方法描述起來就一句話:結合具體的問題,深入的理解數學理論知識,將理論程序化,嘗試用程序設計實現理論原理。達到這樣的程度,問題基本上都可以解決的。(限於篇幅,很多問題不能展開,您可以通過mailto:zengyi@cstc.net.cn與我聯繫)


參考文獻:

1. 《計算機科學技術百科全書》中國計算機學會 清華大學出版社
2. 《工程數學—線性代數》同濟大學數學教研室 同濟大學出版社
3. 《數值分析》李慶揚 華中科技大學出版社

(全文完)


0%(0)
0%(0)
標 題 (必選項):
內 容 (選填項):
實用資訊
回國機票$360起 | 商務艙省$200 | 全球最佳航空公司出爐:海航獲五星
海外華人福利!在線看陳建斌《三叉戟》熱血歸回 豪情築夢 高清免費看 無地區限制
一周點擊熱帖 更多>>
一周回復熱帖
歷史上的今天:回復熱帖
2004: 美國頂級大學爭論的個人終極思考
2002: 謀害生命的英語
2002: 我如何當“槍手” 一入道很深的“老槍